книга заданий пайтон. книга практических заданий, pyton. Сборник упражнений Введение в язык Python с задачами и решениями Бен Стивенсон Москва, 2021 удк 004. 438Python
Скачать 2.24 Mb.
|
Упражнение 163. Популярные детские имена## # Отображаем мужские и женские имена, бывшие самыми популярными как минимум # в одном году с 1900–го по 2012–й # FIRST_YEAR = 1900 LAST_YEAR = 2012 ## Загружаем первую строку из файла, извлекаем имя и добавляем его к списку имен, # если его там еще нет # @param fname – имя файла, из которого будут считываться данные # @param names – список, к которому будем добавлять данные (если они отсутствуют) # @return (None) def LoadAndAdd(fname, names): # Открываем файл, читаем первую строку и извлекаем имя inf = open(fname, "r") line = inf.readline() inf.close() parts = line.split() name = parts[0] # Добавляем имя в список, если оно там еще не присутствует if name not in names: names.append(name) # Отображаем мужские и женские имена, бывшие самыми популярными как минимум # в одном году с 1900–го по 2012–й def main(): # Создаем списки для хранения самых популярных имен girls = [] boys = [] # Обрабатываем все годы из диапазона, читая первые строки из файлов с мужскими и женскими именами for year in range(FIRST_YEAR, LAST_YEAR + 1): girl_fname = "../Data/BabyNames/" + str(year) + \ "_GirlsNames.txt" boy_fname = "../Data/BabyNames/" + str(year) + \ "_BoysNames.txt" В данном решении я предположил, что файл с именами лежит не в той же папке, где файл Python. Если ваши файлы находятся в той же директории, часть пути к файлу ../Data/BabyNames/ нужно пропустить. LoadAndAdd(girl_fname, girls) LoadAndAdd(boy_fname, boys) # Выводим списки print("Самые популярные имена девочек:") for name in girls: print(" ", name) print() print("Самые популярные имена мальчиков: ") for name in boys: print(" ", name) # Вызов основной функции main() Упражнение 167. Проверяем правильность написания## # Находим и отображаем все слова в файле, написанные неправильно # from only_words import onlyTheWords import sys WORDS_FILE = "../Data/words.txt" # Убедимся, что программе передано допустимое количество аргументов командной строки if len(sys.argv) != 2: print("При вызове программы должен быть указан один аргумент.") print("Завершаем программу...") quit() # Открываем файл. Выходим, если возникла ошибка try: inf = open(sys.argv[1], "r") except: print("Ошибка при открытии файла '%s' на чтение. Завершаем программу..." % \ sys.argv[1]) quit() # Загружаем все слова в словарь. В значения ставим 0, но использовать его не будем valid = {} words_file = open(WORDS_FILE, "r") for word in words_file: # Переводим слово в нижний регистр и удаляем символ новой строки word = word.lower().rstrip() # Добавляем слово в словарь valid[word] = 0 words_file.close() В данном решении используются словари со словами в виде ключей и неиспользуемыми значениями. В целом эффективнее в этой ситуации будет использовать наборы (set), если вы знакомы с подобной структурой данных. Списки использовать не рекомендуется из-за их медлительности при поиске элементов. # Читаем все строки из файла, добавляя слова с ошибками в соответствующий список misspelled = [] for line in inf: # Избавляемся от знаков препинания при помощи функции из упражнения 117 words = onlyTheWords(line) for word in words: # Если слово написано неправильно и отсутствует в списке, добавляем его туда if word.lower() not in valid and word not in misspelled: misspelled.append(word) # Закрываем анализируемый файл inf.close() # Отображаем слова с ошибками или сообщение об их отсутствии if len(misspelled) == 0: print("Все слова написаны правильно.") else: print("Следующие слова написаны неправильно:") for word in misspelled: print(" ", word) Упражнение 169. Редактирование текста в файле## # Редактируем файл, удаляя в нем служебные слова. Отредактированная версия # записывается в новый файл # # Заметьте, что в этой программе не выполняются проверки на ошибки # и она регистрозависимая # # Запрашиваем у пользователя имя файла для редактирования и открываем его inf_name = input("Введите имя файла для редактирования: ") inf = open(inf_name, "r") # Запрашиваем у пользователя имя файла со служебными словами и открываем его sen_name = input("Введите имя файла со служебными словами: ") sen = open(sen_name, "r") # Загружаем все служебные слова в список words = [] line = sen.readline() while line != "": line = line.rstrip() words.append(line) line = sen.readline() # Закрываем файл со служебными словами sen.close() Файл со служебными словами может быть закрыт в середине программы, поскольку все слова из него уже считаны в список. # Запрашиваем у пользователя имя нового файла и открываем его outf_name = input("Введите имя нового файла: ") outf = open(outf_name, "w") # Считываем все строки из исходного файла. Заменяем все служебные слова на звездочки. # Пишем строки в новый файл. line = inf.readline() while line != "": # Ищем и заменяем служебные слова. Количество звездочек соответствует # длине исходного слова for word in words: line = line.replace(word, "*" * len(word)) # Пишем измененную строку в новый файл outf.write(line) # Читаем следующую строку из исходного файла line = inf.readline() # Закрываем исходный и новый файлы inf.close() outf.close() |