Начинаем изучать инструменты Python, предназначенные для работы с текстовыми файлами форматов .txt, .md и .csv: напишем программы для поиска и замены слов, подсчета стоимости товаров, получения статистики по тексту и преобразования информации из csv-файла в словарь.
Имеется текстовый файл prices.txt с информацией о заказе из интернет магазина. В нем каждая строка с помощью символа табуляции \t разделена на три колонки:
Напишите программу, подсчитывающую общую стоимость заказа.
РешениеСпособ 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)
Имеется файл 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)]