Работа с текстовыми файлами, не требующими сложного форматирования

Обновлено: 02.07.2024

Python предоставляет встроенные функции и модули для поддержки этих операций.

Открытие/закрытие файла

Чтение/запись текстовых файлов

Объект fileObj, возвращаемый после открытия файла, содержит указатель файла. Первоначально он располагается в начале файла и перемещается вперед всякий раз, когда выполняются операции чтения/записи.

Чтение строки/строк из текстового файла
  • fileObj.readline() -> str : (наиболее часто используемый) Читает следующую строку (до и включая новую строку) и возвращает строку (включая новую строку). Он возвращает пустую строку после конца файла (EOF).
  • fileObj.readlines() -> [str] : чтение всех строк в список строк.
  • fileObj.read() -> str : чтение всего файла в строку.
Запись строки в текстовый файл
  • fileObj.write(str) -> int : Записать заданную строку в файл и вернуть количество записанных символов. Вам нужно явно завершить str с помощью '\n' , если это необходимо. '\n' будет преобразован в новую строку в зависимости от платформы ("\r\n" для Windows или '\n' для Unix/Mac OS).
Примеры

Построчная обработка текстового файла

Мы можем использовать оператор with для открытия файла, который будет автоматически закрыт при выходе, и цикл for для построчного чтения следующим образом:

Выражение with эквивалентно выражению try-finally следующим образом:

Пример: построчное копирование файла

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

Операции с двоичными файлами

  • fileObj.tell() -> int : возвращает текущую позицию в потоке. Текущая позиция потока — это количество байтов от начала файла в двоичном режиме и непрозрачное число в текстовом режиме.
  • fileObj.seek(смещение): устанавливает текущую позицию в потоке на смещение байт от начала файла.

Например, [ЗАДАЧ]

Каталог и управление файлами

В Python управление каталогами и файлами поддерживается модулями os , os.path , Shutil , .

Операции с путями с использованием модуля os.path

В Python путь может означать:

  1. файл,
  2. каталог или
  3. символическая ссылка (символическая ссылка).

Путь может быть абсолютным (начиная с корня) или относительным относительно текущего рабочего каталога (CWD).

Разделитель пути зависит от платформы (Windows использует '\' , а Unix/Mac OS использует ' /' ). Модуль os.path поддерживает независимые от платформы операции над путями, разумно обрабатывая разделитель путей.

Проверка существования и типа пути
  • os.path.exists(path) -> bool : проверить, существует ли указанный путь.
  • os.path.isfile(путь_к_файлу) , os.path.isdir(путь_к_каталогу) , os.path.islink(путь_ссылки) -> bool : проверить, является ли указанный путь файлом, каталогом или символической ссылкой.
Формирование нового пути

Разделитель пути зависит от платформы (Windows использует '\' , а Unix/Mac OS использует '/' ). Для переносимости важно НЕ жестко кодировать разделитель пути. Модуль os.path поддерживает независимые от платформы операции над путями, разумно обрабатывая разделитель путей.

  • os.path.sep : разделитель путей текущей системы.
  • os.path.join(path, *paths) : формирование и возврат пути путем объединения одного или нескольких компонентов пути путем вставки зависящего от платформы разделителя пути ( '/' или '\' ). Чтобы сформировать абсолютный путь, вам нужно начать с os.path.sep от имени пользователя root.
Управление именем каталога и именем файла
  • os.path.dirname(путь) : возвращает имя каталога для заданного пути (файл, каталог или символическая ссылка). Возвращаемое имя каталога может быть абсолютным или относительным, в зависимости от заданного пути.
  • os.path.abspath(path) : возвращает абсолютный путь (начиная с корня) заданного path . Это может быть абсолютное имя файла, абсолютное имя каталога или абсолютная символическая ссылка.

Например, чтобы сформировать абсолютный путь к файлу с именем out.txt в том же каталоге, что и in.txt , вы можете извлечь абсолютное имя каталога из in.txt , а затем присоединиться к out.txt следующим образом:

Когда модуль загружается в Python, __file__ устанавливается на имя модуля. Попробуйте запустить этот скрипт с различными ссылками на __file__ и изучите их вывод:

Обработка символической ссылки (Unixes/Mac OS)
  • os.path.realpath(path) : (для символических ссылок) Аналогично abspath() , но возвращает канонический путь, исключая любые встречающиеся символические ссылки.

Управление каталогами и файлами с помощью модулей os и Shutil

Модули os и Shutil обеспечивают интерфейс к операционной системе и системной оболочке.

  • Если вы хотите просто прочитать или записать файл, используйте встроенную функцию open() .
  • Если вы просто хотите управлять путями (файлами, каталогами и символическими ссылками), используйте модуль os.path.
  • Если вы хотите прочитать все строки во всех файлах в командной строке, используйте модуль ввода файлов.
  • Для создания временных файлов/каталогов используйте модуль tempfile.
Управление каталогом
Управление файлами
  • os.rename(src_file, dest_file) : переименовать файл.
  • os.remove(файл) или os.unlink(файл): удалить файл. Вы можете использовать os.path.isfile(file), чтобы проверить, существует ли file.

Например [TODO],

Список каталогов
  • os.listdir(path='.') -> [path] : список всех записей в данном каталоге (исключая '.' и '..' ), по умолчанию текущий каталог.
Рекурсивное отображение каталога с помощью os.walk()
  • os.walk(top, topdown=True, onerror=None, followlinks=False): рекурсивно перечислить все записи, начиная с top .
Рекурсивное отображение каталога с помощью модуля glob (Python 3.5)
Копирование файла
Команда оболочки [TODO]
  • os.system(command_str) : запустить команду оболочки. (В Python 3 вместо этого используйте subprocess.call().)
Переменные среды [TODO]
  • os.getenv(varname, value=None) : возвращает переменную среды, если она существует, или value, если ее нет. , по умолчанию нет .
  • os.putenv(имя_переменной, значение) : установите для переменной среды значение значение.
  • os.unsetenv(имя_переменной): удалить (сбросить) переменную среды.

модуль ввода файла

Модуль fileinput обеспечивает поддержку обработки строк ввода из одного или нескольких файлов, указанных в аргументах командной строки ( sys.argv ). Например, создайте следующий скрипт с именем " test_fileinput.py ":

Обработка текста

Для простых операций с текстовыми строками, таких как поиск и замена строк, можно использовать встроенные строковые функции (например, str.replace(old, new)) ) . Для поиска и замены сложных шаблонов вам необходимо освоить регулярное выражение (регулярное выражение).

Операции со строками

Встроенный класс str предоставляет множество функций-членов для работы с текстовыми строками. Предположим, что s — это объект str.

Удалить пробелы (пробел, табуляция и новая строка)
  • s.strip()-> str : возвращает копию строки s с удаленными начальными и конечными пробелами. Пробелы включают пробел, табуляцию и новую строку.
  • s.strip([chars]) -> str : удаляет заданные начальные/конечные символы вместо пробелов.
  • s.rstrip() , s.lstrip() -> str : удаляет правые (конечные) пробелы и левые (начальные) пробелы соответственно.< /li>

s.rstrip() чаще всего используется для удаления завершающих пробелов/перевода строки. Ведущие пробелы обычно имеют значение.

Верхний/нижний регистр
  • s.upper() , s.lower() -> str : возвращает копию строки s, преобразованную в верхний и нижний регистр. соответственно.
  • s.isupper() , s.islower() -> bool : проверьте, является ли строка прописной или строчной, соответственно.
  • s.find(key_str, [начало], [конец]) -> int|- 1 : вернуть самый низкий индекс в срезе s [начало:конец] (по умолчанию вся строка); или -1, если не найдено.
  • s.index(key_str, [начало], [конец]) -> int|ValueError : аналогично find() , но вызывает ValueError, если не найдено.
  • s.startswith(key_str, [начало], [конец]) , s .endsswith(key_str, [начало], [конец]) -> bool : проверить, начинается или заканчивается строка с key_str .
Найти и заменить
  • s.replace(old, new, [count]) -> str : вернуть копию при этом все вхождения old заменены на new . Необязательный параметр count ограничивает количество заменяемых вхождений, по умолчанию все вхождения.

str.replace() идеально подходит для простой замены текстовой строки без необходимости сопоставления с образцом.

Разделить на токены и объединить
  • s.split([sep], [maxsplit=-1]) -> [str] : возвращает список слов. используя sep в качестве строки-разделителя. Разделителем по умолчанию являются пробелы (пробел, табуляция и новая строка). maxSplit ограничивает максимальное количество операций разделения, по умолчанию -1 означает отсутствие ограничений.
  • sep.join([str]) -> str : обратный метод split() .Присоединяйтесь к списку строк с помощью sep в качестве разделителя.

Регулярное выражение в модуле re

Я предполагаю, что вы знакомы с регулярными выражениями, иначе вы могли бы прочитать:

  • "Регулярное выражение на примерах" для обзора синтаксиса регулярных выражений и примеров.
  • "Регулярные выражения" для полного охвата.

Модуль re обеспечивает поддержку регулярных выражений (regex).

Обратная косая черта ( \ ), исходная строка Python r'. ' против обычной строки

В синтаксисе регулярного выражения используется обратная косая черта ( \ ):

  1. для метасимволов, таких как \d (цифра), \D (не цифра), \s (пробел), \S (не пробел), \w (слово), \W (не слово)
  2. для экранирования специальных символов регулярных выражений, например, \. для . , \+ для + , \* для * , \? для ? . Вам также нужно написать \\ для соответствия \ .

С другой стороны, обычные строки Python также используют обратную косую черту для управляющих последовательностей, например, \n для новой строки, \t для табуляции. Опять же, вам нужно написать \\ вместо \ .

Чтобы записать шаблон регулярного выражения \d+ (одна или несколько цифр) в обычную строку Python, вам нужно написать '\\d+' . Это громоздко и чревато ошибками.

Решение Python использует необработанную строку с префиксом r в форме r'. ' . Он игнорирует интерпретацию управляющей последовательности строки Python. Например, r'\n' — это '\'+'n' (два символа) вместо новой строки (один символ). Используя необработанную строку, вы можете написать r'\d+' для шаблона регулярного выражения \d+ (вместо обычной строки '\\d+' ).

Кроме того, Python обозначает обратные ссылки в скобках (или группы захвата) как \1 , \2 , \3 , . которые могут быть записаны как необработанные строки r'\1' , r'\2' вместо обычных строк '\\1' и '\\2' . Обратите внимание, что в некоторых языках используются $1, $2, . для обратных ссылок.

Я предлагаю вам использовать необработанные строки для строк шаблонов регулярных выражений и строк замены.

Компиляция (создание) объекта шаблона регулярных выражений
Вызов операций регулярных выражений

Вы можете вызывать большинство функций регулярных выражений двумя способами:

  1. regexObj.func(str): применить скомпилированное регулярное выражение object к str , через функцию-член SRE_Pattern func() .
  2. re.func(regexObj|regexStr, str) : применить объект регулярного выражения (скомпилированный) или < em>regexStr (не скомпилировано) в str через функцию уровня модуля re func() . Эти функции уровня модуля представляют собой ярлыки для описанных выше, которые не требуют предварительной компиляции объекта регулярного выражения, но пропускают модификаторы, если используется regexStr.
Найти с помощью finalAll()
  • regexObj.findall(str) -> [str] : возвращает список всех совпадающих подстрок.
  • re.findall(regexObj|regexStr, str) -> [str] : то же, что и выше.
Заменить с помощью sub() и subn()
  • regexObj.sub(replaceStr, inStr, [count=0]) -> outStr: заменить (заменить) совпавшие подстроки в заданном inStr на replaceStr , до количества вхождений, по умолчанию все.
  • regexObj.subn(replaceStr, inStr, [count=0]) -> (outStr, count) : аналогично sub() , но возвращает новую строку вместе с количеством замен в двух кортежах.
  • re.sub(regexObj|regexStr, replaceStr, inStr, [count=0]) ->outStr: то же, что и выше.
  • re.subn(regexObj|regexStr, replaceStr, inStr, [count=0]) -> (outStr, count) : то же, что и выше.

Примечания. Для простой замены строки используйте str.replace(old, new, [max= -1]) -> str, что более эффективно. См. раздел выше.

Использование обратных ссылок в скобках \1 , \2 , . в замене и шаблоне

В Python обратные ссылки в круглых скобках регулярных выражений (группы захвата) обозначаются как \1 , \2 , . Вы можете использовать необработанную строку (например, r'\1' ), чтобы избежать экранирования обратной косой черты в обычной строке (например, '\\1' ).

Найти с помощью search() и Match Object

Поиск() возвращает специальный объект Match, инкапсулирующий первое совпадение (или None, если совпадений нет). Затем вы можете использовать следующие методы для обработки результирующего объекта Match:

  • matchObj.group() : возвращает совпадающую подстроку.
  • matchObj. start() : возвращает начальную совпадающую позицию (включительно).
  • matchObj. end() : возвращает конечную совпавшую позицию (эксклюзивно).
  • matchObj. span() : возвращает кортеж совпадающей позиции (начало, конец).

Чтобы получить обратные ссылки (или группы захвата) внутри объекта Match:

  • matchObj. groups() : возвращает кортеж захваченных групп (или обратных ссылок)
  • matchObj .group(n) : возвращает захватываемую группу n , где n начинается с 1 .
  • matchObj.lastindex : последний индекс захватываемой группы
Поиск с использованием match() и fullmatch()

Search() соответствует любому заданному элементу inStr[begin:end] . С другой стороны, match() соответствует с начала inStr[начало:конец] (аналогично в шаблон регулярного выражения ^. ); в то время как fullmatch() соответствует всему inStr[begin:end] (аналогично шаблону регулярного выражения ^. $ ).

Найти с помощью finditer()

Функция finditer() аналогична функции findall(). findall() возвращает список совпадающих подстрок. Finditer() возвращает итератор для объектов Match. Например,

Разделение строки на токены

Функция split() разбивает заданный inStr на список, используя шаблон регулярного выражения в качестве разделителя (разделителя). Например,

Примечания. Для простого разделителя используйте str.split([sep]) , что более эффективно. См. раздел выше.

Парсинг веб-страниц

Ссылки:

Скрапинг веб-страниц (или сбор веб-страниц или извлечение веб-данных) означает чтение необработанной HTML-страницы для извлечения нужных данных. Излишне говорить, что вам необходимо освоить HTML, CSS и JavaScript.

Python поддерживает просмотр веб-страниц с помощью запросов пакетов и BeautifulSoup (bs4).

Установить пакеты

Вы можете установить соответствующие пакеты с помощью pip следующим образом:

Шаг 0. Проверка целевой веб-страницы
  1. Нажмите F12 на целевой веб-странице, чтобы включить отладчик F12.
  2. Выберите «Инспектор».
  3. Нажмите кнопку "Выбрать" (крайний левый значок со стрелкой) и наведите указатель мыши на нужную часть HTML-страницы. Изучите коды.
Шаг 2. Преобразование HTML-текста в древовидную структуру с помощью BeautifulSoup и поиск нужных данных

Вы можете записать выбранные данные в файл:

Вы также можете использовать модуль csv для записи строк данных с заголовком:

Шаг 3. Загрузите выбранный документ с помощью urllib.request

Возможно, вы захотите загрузить такие документы, как текстовые файлы или изображения.

Шаг 4. Задержка

Чтобы избежать рассылки спама на веб-сайт с запросами на загрузку (и пометки как спамера), вам необходимо на некоторое время приостановить работу кода.

Обычный текст или файлы .txt – это простой и практичный формат, который должен использоваться в рабочем процессе каждого писателя или блоггера.

Простой текстовый файл – это документ, не содержащий форматирования, изображений, цветов или других типов разметки. Он также включает одиночные разрывы строк и интервалы.

Файл форматированного текста — это формат по умолчанию для популярных текстовых процессоров, таких как Microsoft Word, Apple Pages and Notes, Google Doc и даже электронных писем в формате HTML.

Вот пять неожиданных преимуществ текстовых файлов.

1. Вам не нужно беспокоиться, если люди смогут их открыть

Объяснение файлов с обычным текстом и форматированным текстом

Для открытия обычного текстового файла не требуется специального программного обеспечения или инструментов. Это настоящая проблема для определенных форматов, как понимают те, кто пытался открыть файл .docx в старых версиях Word.

Различные текстовые редакторы не всегда могут открывать определенные типы файлов.

Если файл имеет формат обычного текста, вы можете быть уверены, что любой сможет открыть его в любой системе. Обычные текстовые файлы существуют дольше, чем многие операционные системы, и они никуда не денутся.

2. Обычные текстовые файлы легкие и быстрые

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

Они также меньше по размеру, чем проприетарные текстовые редакторы, что упрощает их отправку по электронной почте и обмен ими с другими. Кроме того, операционным системам легче индексировать текстовые файлы, что означает, что они быстрее отображаются в общесистемном поиске.

3. Быстрее написать что-то короткое в обычном текстовом редакторе

Обычный текст По сравнению с форматированными текстовыми файлами: объяснение

Обычный текст может быть быстрым способом написания

Word, Pages и различные другие текстовые процессоры содержат множество шаблонов, параметров, инструментов и меню, предназначенных для сложных задач.

Иногда все, что нужно писателю, — это место для ввода текста, проверка орфографии и некоторые основные параметры форматирования.

Все эти меню, ленты и инспекторы могут отвлекать. И они медленно пишут. TextEdit, Блокнот и Vim заслуживают любви.

И существует множество других текстовых редакторов, которые выглядят так же хорошо, как и их проприетарные старшие братья.

4. Обычные текстовые файлы гибки

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

Иногда я пишу статьи в виде простого текста, копирую и вставляю результаты в Grammarly (прочитайте наш обзор Grammarly). Затем я беспокоюсь о форматировании.

Другими словами, если изначально это обычный текст, его легко перенести на более сложное приложение. Если это сложное приложение, возврат к обычному тексту займет гораздо больше времени.

5. Обычный текст всегда выглядит одинаково

Вы можете часами форматировать документ в текстовом редакторе, но кто-то другой откроет его и обнаружит, что на его компьютере он выглядит немного иначе.

Формат обычного текстового файла выглядит одинаково в любой системе.

В обычных текстовых редакторах отсутствуют сложные параметры форматирования, но зачастую эти функции не нужны, пока документ не будет близок к завершению.

На этом этапе вам следует подумать об экспорте документа в формат PDF.

Совет: используйте Markdown при написании простого текста

Markdown — это способ форматирования простых текстовых документов для Интернета с использованием следующих символов:

  • Звездочка для курсива
  • Двойная звездочка для курсива.
  • Единый хэштег для H1.
  • Двойной хэштег для H2.
  • и так далее

Вы можете написать обычный текстовый файл, а затем скопировать его в редактор форматированного текста. Многие из них распознают Markdown и применяют форматирование соответствующим образом. Этот рабочий процесс хорошо работает с редактором WordPress Gutenberg.

Это тип языка разметки. Ознакомьтесь с полным списком синтаксиса Markdown.

В качестве альтернативы можно использовать такие приложения, как IA Writer или Byword. Это сохранит вашу работу как обычный текст. Но вы можете скопировать предварительно отформатированный документ, если он написан в Markdown.

Последнее слово: обычный текст против форматированного текста:

Если вы хотите быстро и легко написать что-то, а затем скопировать и вставить это в различные приложения, выберите обычный текст. Когда вы будете готовы отформатировать и оформить документ, выберите форматированный текст. Если вы широко используете Документы Google и Word, придерживайтесь форматированного текста.

Хотите узнать больше? Ознакомьтесь с нашим списком лучших приложений для письма.

Обычный текст и форматированный текст: часто задаваемые вопросы

В чем разница между форматированным текстом и обычным текстом?

В обычном текстовом документе отсутствует какое-либо форматирование, цвета, изображения, стили и медиафайлы. Обычно это файл .txt. Документы с форматированным текстом включают все это.

Для чего используется форматированный текст?

Люди используют форматированный текст для форматирования и оформления документа. Он также используется, когда кто-то хочет добавить другие медиафайлы, например изображения.

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

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

Чтение в текстовых файлах

  1. Разделители строк — символы новой строки ('\n'), используемые для отделения одной строки данных от другой строки.
  2. Разделители — запятые (',') и табуляции ('\t'), используемые для разделения фрагментов данных в одной строке. В прошлом вертикальная черта ('|') также часто использовалась в качестве разделителя.

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

  • CSV – файлы значений, разделенных запятыми. Они обычно используются для импорта и экспорта в программах для работы с электронными таблицами.
  • Текстовые файлы с разделителями табуляцией. Они также обычно используются для импорта и экспорта программами электронных таблиц. Они предпочтительнее файлов CSV, если часть данных может содержать запятую.

Чтение данных из файла с данными, разделенными строками

Предположим, у вас есть клуб, список членов которого хранится в текстовом файле. Мы хотим написать программу, которая будет печатать простое приветствие для каждого участника. Прежде чем мы это сделаем, давайте посмотрим на входной файл «members.txt»:

Вот программа, которая считывает этот файл и печатает простое приветствие для каждого участника:

В строке 1 мы используем функцию open(), чтобы открыть файл с именем «members.txt» только для чтения и присвоить дескриптор файла переменной infile. Первым аргументом функции open() является имя файла. Второй аргумент функции open() — это файловый режим. В данном случае "r" означает, что мы открываем файл только для чтения.

Строка 2 вызывает функцию readlines(). Эта функция считывает все строки из файла и сохраняет каждую строку как элемент списка.В этом случае мы называем этот список строками. Поскольку мы закончили чтение всех строк из файла, мы закрываем дескриптор файла в строке 3.

Поскольку строки — это список, мы обрабатываем строки с помощью цикла for. Поскольку мы собираемся обрабатывать каждый элемент в этом списке одинаково, мы используем цикл for-each. В строке 5 мы просто печатаем литеральную строку «Добро пожаловать», за которой следует элемент из списка строк. Вот результат пробного запуска:

Обратите внимание, что между каждым приветствием есть пустая строка. Это связано с тем, что при создании списка строк каждый из элементов берется из строки во входном файле. Каждая из этих строк имеет в конце символ новой строки ('\n'), что и приводит к появлению дополнительных пустых строк. Если вы хотите удалить символы новой строки, вы можете просто использовать line.strip() вместо строки в строке 5 программы.

Чтение файлов с несколькими фрагментами данных в каждой строке

Обычно при вводе файлов с обычными текстовыми файлами каждая строка состоит из нескольких частей данных. Давайте посмотрим на входной файл с такими данными. Вот файл "students.txt":

Этот файл содержит имя студента, за которым следуют три экзаменационных балла. Мы хотим обработать файл так, чтобы при запуске наша программа выдавала следующий вывод:

Чтобы это работало, нам нужно использовать функцию split() в каждой строке, чтобы мы могли отделить имя от оценок и оценки друг от друга. Имейте в виду, что split() создает список строк, поэтому некоторые из этих строк необходимо преобразовать в числа, чтобы их можно было рассматривать как баллы. Вот код программы:

Строка 1 открывает "students.txt" для чтения и сохраняет дескриптор файла как infile. Строка 2 считывает все строки из infile и сохраняет их в списке с именем lines. Строка 3 закрывает дескриптор файла.

Строки 4–10 определяют цикл for, который перебирает все строки. Поскольку мы хотим сделать одно и то же для каждой строки, мы используем цикл стиля for-each для основного цикла. Строка 5 разделяет каждую строку с помощью запятой и сохраняет полученный список строк в виде токенов. Имя переменной, tokens, выбрано, так как разбиение строки на части для анализа частей этой строки называется токенизацией.

Строки 6–8 выполняют шаблон накопитель для получения суммы баллов. Обратите внимание, что мы не обрабатываем каждый из элементов в списке токенов одинаково; мы не хотим рассматривать первый элемент как оценку. Вот почему в строке 7 мы используем цикл for на основе индекса. В строке 8 мы преобразуем элемент в число (поскольку функция split() всегда создает список строк) перед добавлением его к сумме.

Строка 9 получает среднее значение. Обратите внимание, что мы делим на единицу меньше, чем количество жетонов, так как первый жетон — это имя учащегося, а не оценка. Наконец, в строке 10 печатается имя учащегося, за которым следует "имеет среднее значение", а затем среднее значение.

Вы можете себе представить, что можно создать простую программу оценивания, расширив то, что мы сделали здесь.

Функции readline() и read()

Есть еще две функции, которые можно использовать для чтения из дескриптора файла, подключенного к файлу, открытому для чтения. Это функции readline() и read().

строка чтения()

Функция readline() считывает одну строку из файла и перемещает указатель строки на одну строку вперед. Можно вызывать readline() снова и снова, пока не будет прочитан весь файл, по одной строке за раз. Обычно функция readline() используется, когда вы хотите прочитать только одну строку из файла, потому что эта строка содержит, например, информацию заголовка.

Рассмотрите текстовый файл с именем "data.txt" со следующим содержимым:

Это может быть обработано следующей программой для создания HTML-вывода:

Строка 2 считывает первую строку входного файла в переменную line1. Строка 3 считывает остальные строки из входного файла и сохраняет их в списке с именем lines.

Строки 14–20 обрабатывают остальные строки файла, чтобы они стали данными таблицы. Выходной файл "data.html" имеет следующее содержимое:

Функция read() считывает все содержимое файла как одну строку. Функция read() будет использоваться при анализе файлов JSON. Функция read() также будет использоваться при анализе файлов HTML или XML с помощью BeautifulSoup.

Объединение ввода файла с выводом файла

  1. Выполнить преобразование файлов из одного формата в другой формат.
  2. Разбейте большую задачу программирования на несколько небольших программ, чтобы выходные данные первой программы становились входными данными для второй программы и т. д.

Преобразование файлов

Пример программирования, показывающий использование функции readline(), является примером преобразования файлов. Входной файл представлял собой файл CSV (значения, разделенные запятыми), а выходной файл был отформатирован как файл HTML.

Разбиение большой проблемы на несколько более мелких

Предположим, у вас есть данные, для обработки которых требуется три последовательных шага. Вы можете написать одну программу, которая будет считывать данные, выполнять первый шаг обработки и сохранять обработанные данные в выходной файл. Вторая программа может взять выходной файл из первой программы в качестве входных данных и выполнить второй этап обработки данных. Результат второй программы станет входом для третьей программы. Наконец, третья программа выполняет окончательную обработку. Разделение того, что было бы одной большой программой, на три программы, сделало бы программы меньше и их было бы легче писать/отлаживать. Это также позволит разным программистам одновременно работать над разными программами.

Ввод файла — самопроверка

Вот несколько вопросов о вводе файлов, которые вы можете использовать, чтобы проверить свое понимание.

Вопрос 1

Напишите программу, которая может обрабатывать следующий входной файл "students1.txt":

Вы хотите, чтобы ваша программа выводила на экран следующий вывод при запуске:

Вопрос 2

Напишите программу, которая может обрабатывать следующий входной файл "customers.txt". Этот файл содержит фамилию, имя и цены товаров, которые они приобрели за последний период, через запятую.

Вы хотите, чтобы ваша программа выводила на экран следующий вывод при запуске:

Вопрос 3

Напишите программу, которая может обрабатывать следующий входной файл "scores.txt". В этом файле есть имя студента, за которым следуют его/ее экзаменационные баллы. У студента не одинаковое количество экзаменов.

Вы хотите, чтобы ваша программа выводила на экран следующий вывод при запуске:

Эта заставка показывает, как импортировать различные текстовые файлы в R с помощью пакета readtext. В настоящее время readtext поддерживает простые текстовые файлы (.txt), данные в той или иной форме нотации объектов JavaScript (.json), значения, разделенные запятыми или символами табуляции (.csv, .tab, .tsv), XML-документы (.xml), а также файлы в формате PDF и Microsoft Word (.pdf, .doc, .docx).

readtext также обрабатывает несколько файлов и типов файлов, используя, например, выражение «glob», файлы из URL-адреса или архивного файла (.zip, .tar, .tar.gz, .tar.bz). Обычно вам не нужно явно определять формат файлов — readtext берет эту информацию из окончания файла.

Пакет readtext поставляется с каталогом данных extdata, который содержит примеры всех перечисленных выше файлов. В виньетке мы используем этот каталог данных.

Каталог extdata содержит несколько подпапок, содержащих различные текстовые файлы. В следующих примерах мы загружаем один или несколько файлов, хранящихся в каждой из этих папок. Команда paste0 используется для объединения папки extdata из пакета readtext с подпапками. При чтении пользовательских текстовых файлов вам нужно будет определить собственный каталог данных (см. ?setwd() ).

2.1 Обычные текстовые файлы (.txt)

Папка «txt» содержит подпапку с именем UDHR с файлами .txt Всеобщей декларации прав человека на 13 языках.

Мы можем указать метаданные уровня документа ( docvars ) на основе имен файлов или отдельного data.frame. Ниже мы берем docvars из имен файлов ( docvarsfrom = "filenames" ) и устанавливаем имена для каждой переменной ( docvarnames = c("unit", "context", "year", "language", "party")). Команда dvsep = "_" определяет разделитель (строку символов регулярного выражения), включенный в имена файлов для разграничения элементов docvar.

readtext также может проклинать подкаталоги. В нашем примере папка txt/movie_reviews содержит две подпапки (называемые neg и pos). Мы можем загрузить все тексты, содержащиеся в обеих папках.

2.2 Значения, разделенные запятыми или символами табуляции (.csv, .tab, .tsv)

Чтение значений, разделенных запятыми (CSV-файлы), содержащих текстовые данные. Мы определяем переменную texts в нашем файле .csv как text_field. Это столбец, содержащий фактический текст. Остальные столбцы исходного CSV-файла ( Year , President , FirstName ) по умолчанию рассматриваются как переменные уровня документа.

Та же процедура применяется к значениям, разделенным табуляцией.

2.3 Данные JSON (.json)

Вы также можете читать данные .json. Вам снова нужно указать text_field .

2.4 PDF-файлы

readtext также может считывать и преобразовывать файлы .pdf.

В приведенном ниже примере мы загружаем все файлы .pdf, хранящиеся в папке UDHR, и определяем, что docvars должны быть взяты из имен файлов. Мы называем переменные уровня документа document и language и указываем разделитель ( dvsep ).

2.5 Файлы Microsoft Word (.doc, .docx)

Файлы в формате Microsoft Word преобразуются с помощью пакета antiword для старых файлов .doc и с использованием XML для новых файлов .docx.

2.6 Текст из URL

Вы также можете читать текст прямо с URL-адреса.

2.7 Текст из архивных файлов (.zip, .tar, .tar.gz, .tar.bz)

Наконец, можно включать текст из архивов.

readtext изначально был разработан в ранних версиях пакета Quanteda для количественного анализа текстовых данных. Он был порожден функцией textfile() из этого пакета и теперь живет исключительно в читаемом тексте. Поскольку конструктор корпуса Quanteda распознает формат data.frame, возвращаемый функцией readtext() , он может создавать корпус непосредственно из объекта readtext, сохраняя все docvars и другие метаданные.

Вы можете легко создать корпус из объекта читаемого текста.

4.1. Удаление номеров страниц с помощью регулярных выражений

Если документ содержит номера страниц, они также импортируются. Если вы хотите удалить их, вы можете использовать регулярное выражение. Мы настоятельно рекомендуем использовать пакет stringi. Наиболее распространенные регулярные выражения вы можете найти в этой памятке.

Сначала необходимо проверить в исходном файле, в каком формате встречаются номера страниц (например, «1», «-1-», «страница 1» и т. д.). Мы можем использовать тот факт, что номерам страниц почти всегда предшествует разрыв строки (\n). После загрузки текста с прочитанным текстом вы можете заменить номера страниц.

В первом примере номера страниц имеют формат «страница X».

Во втором примере мы удаляем номера страниц в формате «- X -».

Такие строковые функции также можно применять к объектам чтения текста.

4.2 Чтение файлов с разными кодировками

Иногда файлы одного типа имеют разные кодировки. Если кодировка файла включена в имя файла, мы можем извлечь эту информацию и правильно импортировать тексты.

Здесь мы получим кодировку из самих имен файлов.

Если мы читаем текстовые файлы без указания кодировки, мы получаем ошибочно отформатированный текст. Чтобы избежать этого, мы определяем кодировку, используя созданную выше файловую кодировку символьного объекта.

Мы также можем добавлять docvars на основе имен файлов.

Из этого файла мы можем легко создать корпусный объект Quanteda.

Читайте также: