🐍 Работа с файлами в Python: 5 задач для начинающих с решениями

Начинаем изучать инструменты Python, предназначенные для работы с текстовыми файлами форматов .txt, .md и .csv: напишем программы для поиска и замены слов, подсчета стоимости товаров, получения статистики по тексту и преобразования информации из csv-файла в словарь.
🐍 Работа с файлами в Python: 5 задач для начинающих с решениями

Стоимость заказа

Имеется текстовый файл prices.txt с информацией о заказе из интернет магазина. В нем каждая строка с помощью символа табуляции \t разделена на три колонки:

  • наименование товара;
  • количество товара (целое число);
  • цена (в рублях) товара за 1 шт. (целое число).

Напишите программу, подсчитывающую общую стоимость заказа.

Решение

Способ 1:

        from operator import mul
with open('prices.txt') as file:
	print(sum(map(lambda line: mul(*map(int, line.split()[1:])), file)))

    

Способ 2:

        import pandas as pd
df = pd.read_csv('prices.txt', sep ='\t', header = None)
df.columns = ['Товар', 'Количество', 'Цена']
df['Итого'] = df['Количество'] * df['Цена']
summa_zakaza = sum(df['Итого'])
print(summa_zakaza)

    

Способ 3:

        with open('prices.txt') as f:
	print(sum(eval('*'.join(s.split()[1:])) for s in f))
    

Способ 4:

        with open('prices.txt') as f:
	print(sum(map(lambda x: int(x[1]) * int(x[2]), map(str.split, f.readlines()))))
    

Способ 5:

        from functools import reduce
with open('prices.txt') as f:
	file = open('prices.txt', mode='r', encoding='utf-8')
	print(reduce(lambda x, y: x + int(y[1]) * int(y[2]), [i.split('\t') for i in [i.strip() for i in file.readlines()]], 0))
    
Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека питониста»

Поиск слова в текстовом файле

Напишите программу, которая принимает поисковый запрос и выводит названия текстовых файлов, содержащих искомую подстроку. Все файлы располагаются в директории D:\Python\Textfiles.

Формат ввода

Строка, содержащая поисковый запрос.

Формат вывода

Список текстовых файлов, содержащих введенную пользователем подстроку.

Пример ввода:

        словарь
    

Пример вывода:

        challenges-for-beginners-5.md
dictionaries-2.md
dictionaries.md
challenges-for-beginners.md
merge-dictionaries.md
dictionaries-4.md
dictionaries-3.md
    

Решение

Поскольку слово может встречаться в одном и том же файле несколько раз, есть смысл сохранять результаты поиска во множестве set.

        import os
if __name__ == '__main__':
	folder = 'D:\\Python\\Textfiles'
	answ = set()
	search = input()
	for filename in os.listdir(folder):
    	filepath = os.path.join(folder, filename)
    	with open(filepath, 'r', encoding = 'utf-8') as fp:
        	for line in fp:
            	if search in line:
                	answ.add(filename)
for i in answ:
	print(i) 

    

Словарь из CSV-файла

Имеется файл data.csv, содержащий информацию в csv-формате. Напишите функцию read_csv() для чтения данных из этого файла. Она должна возвращать список словарей, интерпретируя первую строку как имена ключей, а каждую последующую строку как значения этих ключей. Функция read_csv() не должна принимать аргументов.

Решение

Способ 1:

        import csv
def read_csv():
	with open("data.csv") as f:
    	a = [{k: v for k, v in row.items()}
        	for row in csv.DictReader(f, skipinitialspace=True)]
    	return a
    

Способ 2:

        def read_csv():
	with open('data.csv') as file:
    	keys = file.readline().strip().split(',')
    	return [dict(zip(keys, line.strip().split(','))) for line in file]
    

Способ 3:

        def read_csv():
	with open('data.csv', encoding='utf-8') as file:
    	info = list(map(lambda x: x.strip().split(','), file.readlines()))
    	return [dict(zip(info[0], j)) for j in info[1:]]
    

Способ 4:

        from csv import DictReader
def read_csv():
	with open('data.csv') as file_object:
    	data = DictReader(file_object)
    	ans = list(data)
	return ans

    

Способ 5:

        def read_csv():
	with open("data.csv") as data_file:
    	dict_list = []
    	keys = data_file.readline().strip().split(",")
    	for values in data_file:
        	dict_list.append(dict(zip(keys, values.strip().split(","))))
    	return dict_list
    

Информация о файле

Имеется файл file.txt с текстом на латинице. Напишите программу, которая выводит следующую статистику по тексту:

  • количество букв латинского алфавита;
  • число слов;
  • число строк.

Пример ввода и вывода

Предположим, что file.txt содержит приведенный ниже текст:

        Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.

    

В этом случае программа должна вывести информацию о файле в следующем виде:

        Input file contains:
108 letters
20 words
4 lines
    

Решение

Способ 1:

        with open('file.txt') as f:
	txt = f.read()
	print('Input file contains:')
	print(sum(map(str.isalpha, txt)), 'letters')
	print(len(txt.split()), 'words')
	print(txt.count('\n') + 1, 'lines')

    

Способ 2:

        with open('file.txt') as f:
	res = f.readlines()
	f.seek(0)
	words = f.read().split()
	let = sum(len([y for y in x if y.isalpha()]) for x in words)
print('Input file contains:')
print(f'{let} letters')
print(f'{len(words)} words')
print(f'{len(res)} lines')

    

Способ 3:

        with open('file.txt') as f:
	print('Input file contains:')
	print(len(list(filter(lambda x: x.isalpha(), f.read()))), 'letters')
	f.seek(0)
	print(len(f.read().split()), 'words')
	f.seek(0)
	print(len(list(f.readlines())), 'lines')
    

Способ 4:

        with open('file.txt') as file:
	lst = file.read()
	lines = lst.count('\n') + 1
	words = len(lst.split())
	letters = len([c for c in lst if c.isalpha()])
	print(f'Input file contains:\n{letters} letters\n{words} words\n{lines} lines')
    

Способ 5:

        with open('file.txt') as f:
	t = f.read()
	f.seek(0)
	print('Input file contains:')
	print(f'{len(list(filter(str.isalpha, t)))} letters')
	print(f'{len(t.split())} words')
	print(f'{len(f.readlines())} lines')

    

Запрещенные слова

Напишите программу, которая получает на вход строку с названием текстового файла, и выводит на экран содержимое этого файла, заменяя все запрещенные слова звездочками * (количество звездочек равно количеству букв в слове). Запрещенные слова, разделенные символом пробела, хранятся в текстовом файле forbidden_words.txt. Все слова в этом файле записаны в нижнем регистре. Программа должна заменить запрещенные слова, где бы они ни встречались, даже в середине другого слова. Замена производится независимо от регистра: если файл forbidden_words.txt содержит запрещенное слово exam, то слова exam, Exam, ExaM, EXAM и exAm должны быть заменены на ****.

Формат ввода

Строка текста с именем существующего текстового файла, в котором необходимо заменить запрещенные слова звездочками.

Формат вывода

Текст, отредактированный в соответствии с условием задачи.

Пример ввода вывода

Предположим, что forbidden_words.txt содержит следующие запрещенные слова:

        hello email python the exam wor is
    

А текст файла, подлежащего цензуре, выглядит так:

        Hello, world! Python IS the programming language of thE future. My EMAIL is....
PYTHON is awesome!!!!
    

Тогда программа должна вывести отредактированный текст в таком виде:

        *****, ***ld! ****** ** *** programming language of *** future. My ***** **....
****** ** awesome!!!!


    

Решение

Способ 1:

        with open('forbidden_words.txt') as forbidden_words, open(input()) as to_change:
	pattern, text = forbidden_words.read().split(), to_change.read()
text_lower = text.lower()
for word in pattern:
	text_lower = text_lower.replace(word, '*' * len(word))
result = ''.join((y, x)[x == '*'] for x, y in zip(text_lower, text))
print(result)
    

Способ 2:

        with open('forbidden_words.txt') as f:
	forbidden_words = {word: '*' * len(word) for word in f.read().split()}
with open(input()) as f:
	s = f.read()
	s_lower = s.lower()
for forbidden_word in forbidden_words:
	s_lower = s_lower.replace(forbidden_word, forbidden_words[forbidden_word])
print(*map((lambda c1, c2: '*' if c2 == '*' else c1), s, s_lower), sep='')

    

Способ 3:

        with open("forbidden_words.txt", encoding="utf-8") as file, open(input()) as infile:
	text = infile.read()
	for f in file.read().strip("\n").split():
    	pos = text.lower().find(f)
    	while pos > -1:
        	text = text[:pos] + "*" * len(f) + text[pos+len(f):]
        	pos = text.lower().find(f)
print(text)
    

Способ 4:

        import re
with open(input()) as inp, open('forbidden_words.txt') as fw:
	text, forbidden = inp.read(), fw.read().split()
for i in forbidden:
	text = re.sub(i, '*' * len(i), text, flags=re.I)
print(text)
    

Способ 5:

        with open(input(), encoding='utf-8') as r, open('forbidden_words.txt', encoding='utf-8') as s:
	w = s.read().split()
	v = r.read()
	l = v.lower()
	for i in w:
    	l = l.replace(i, '*' * len(i))
    [print(j if j == '*' else i, end='') for i, j in zip(v, l)]
    
***

Материалы по теме

МЕРОПРИЯТИЯ

Комментарии

ВАКАНСИИ

Добавить вакансию
DevOps
от 350000 RUB
AppSec Business Partner
по итогам собеседования
Backend Lead (Python, Django)
по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ