Оглавление
- Закрытие файла в Python
- Запись excel-файлов
- Выявление ошибок
- Способ 1. Загрузка CSV с многострочными полями
- Шаг 4 — Запись файла
- Чтение и запись файлов
- Обработка PDF документов
- Чтение текстовых файлов построчно
- Форматы файлов в Python 3
- Разделение PDF‑файлов на страницы с помощью PyPDF2
- Как читать файл по частям
- Всё же, что такое Python?¶
- Пишем в файлах в Python
- Подготовка
- Открытые файлы в Python
- Чтение данных из файла с помощью Python
Закрытие файла в Python
После того, как мы открыли файл, и выполнили все нужные операции, нам необходимо его закрыть. Для закрытия файла используется функция close().
file = open("text.txt", "r", encoding = "utf-8" ) file.close()
Вышеописанный код, это всего лишь пример работы с файлами, мы не должны забывать, что в ходе работы нашей программы, может произойти что то непредвиденное. Для таких случаев мы используем блок try…finally, о котором мы говорим чуть позже. Ниже пример, с блоком исключений:
try: file = open("text.txt", "r", encoding = "utf-8" ) finally: file.close()
Данная конструкция, гарантирует нам правильное закрытие файла, даже если произойдет ошибка в ходе работы нашей программы.
Лучшим же методом правильного закрытия файла, является конструкция with. Данная конструкция гарантирует нам правильное закрытие файла.
with open("text.txt", "r", encoding = "utf-8" ) as file:
Запись excel-файлов
Для сохранения табличных данных удобнее всего пользоваться библиотекой csv, так как с этим форматом работать проще, он быстрее, может открываться без наличия Excel на рабочем компьютере.
Конечно, бывают ситуации, когда может потребоваться поработать именно с файлами формата «xlsx», для чего подойдет модуль openpyxl. Сначала установим данную библиотеку, так как она не встроена в Питон по умолчанию:
С ее помощью можно читать и записывать данные в «эксель»-файлы.
Основные инструменты, с которыми будем работать:
- Workbook() – класс для создания табличного файла;
- Create_sheet() – внедрение страницы с определенным именем;
- Save() – сохранение результата в файл;
- Cell() – запись информации в ячейку;
- Get_column_letter() – получение буквенного обозначения колонки.
Пример кода:
В результате в созданном файле будем иметь следующее содержимое (рисунок 2).
Рисунок 2 – Результат наполнения xlsx-файла
Также вкладка получит название «Запись».
Выявление ошибок
Иногда, в ходе работы, ошибки случаются. Файл может быть закрыт, потому что какой-то другой процесс пользуется им в данный момент или из-за наличия той или иной ошибки разрешения. Когда это происходит, может появиться IOError. В данном разделе мы попробуем выявить эти ошибки обычным способом, и с применением оператора with. Подсказка: данная идея применима к обоим способам.
Python
try:
file_handler = open(«test.txt»)
for line in file_handler:
print(line)
except IOError:
print(«An IOError has occurred!»)
finally:
file_handler.close()
1 2 3 4 5 6 7 8 |
try file_handler=open(«test.txt») forline infile_handler print(line) exceptIOError print(«An IOError has occurred!») finally file_handler.close() |
В описанном выше примере, мы помещаем обычный код в конструкции try/except. Если ошибка возникнет, следует открыть сообщение на экране
Обратите внимание на то, что следует удостовериться в том, что файл закрыт при помощи оператора finally. Теперь мы готовы взглянуть на то, как мы можем сделать то же самое, пользуясь следующим методом:
Python
try:
with open(«test.txt») as file_handler:
for line in file_handler:
print(line)
except IOError:
print(«An IOError has occurred!»)
1 2 3 4 5 6 |
try withopen(«test.txt»)asfile_handler forline infile_handler print(line) exceptIOError print(«An IOError has occurred!») |
Как вы можете догадаться, мы только что переместили блок with туда же, где и в предыдущем примере. Разница в том, что оператор finally не требуется, так как контекстный диспетчер выполняет его функцию для нас.
Способ 1. Загрузка CSV с многострочными полями
Для начала хотелось бы рассказать о том, в чем преимущество ImportExportDataSql перед стандартными способами загрузки CSV в SQL Server (утилита bcp или операция BULK INSERT).
-
загрузка больших CSV файлов блоками (1 блок = 1 транзакция = N строк, где N указывает сам пользователь)
-
загружать CSV/Excel файлы с возможностью настройки полей, а также с ограничением количества обрабатываемых строк (удобно при отладке)
-
поля в заголовке не привязаны к порядковому номеру, например: файлы с заголовками «Фамилия;Имя;Отчество» и «Имя;Отчество;Фамилия» будут обработаны одинаково, независимо от порядка полей. В «bcp» это можно реализовать только с использованием файлов форматирования, а в BULK INSERT нельзя менять последовательность полей
-
загружать несколько CSV файлов в БД из одной папки, используя маску файлов
-
автоматическое создание таблицы, если её не существует, в том числе во временные глобальные таблицы (рассмотрим в примере ниже). Таблица создается в режиме «Простой импорт», в остальных режимах таблица не создается.
-
поддерживается обработка varbinary полей
-
возможность добавлять свои поля, которых нет в CSV файле с помощью встроенных функций
-
фильтр полей в режиме «Поиск по заголовку»
Список встроенных функций обработки CSV в ImportExportDataSql
-
NEWID — генерация GUID значения
-
ROWNUM — порядковый номер записи
-
EXCELROWNUM — номер строки в CSV/Excel файле
-
FILENAME — имя обрабатываемого файла
В качестве примера, будем использовать текстовый файл с именем multiline.csv, со следующим содержимым:
Шаг 4 — Запись файла
На этом этапе мы запишем новый файл, который включает в себя название «Days of the Week», и дни недели. Сначала создадим переменную title.
files.py
title = 'Days of the Weekn'
Также нужно сохранить дни недели в строковой переменной days. Открываем файл в режиме чтения, считываем файл и сохраняем вывод в новую переменную days.
files.py
path = '/users/sammy/days.txt' days_file = open(path,'r') days = days_file.read()
Теперь, когда у нас есть переменные для названия и дней недели, запишем их в новый файл. Сначала нужно указать расположение файла. Мы будем использовать каталог /users/sammy/. Также нужно указать новый файл, который мы хотим создать. Фактический путь будет /users/sammy/new_days.txt. Мы записываем его в переменную new_path. Затем открываем новый файл в режиме записи, используя функцию open() с режимом w.
files.py
new_path = '/users/sammy/new_days.txt' new_days = open(new_path,'w')
Если файл new_days.txt уже существовал до открытия, его содержимое будет удалено, поэтому будьте осторожны при использовании режима «w».
Когда новый файл будет открыт, поместим в него данные, используя <file>.write(). Операция write принимает один параметр, который должен быть строкой, и записывает эту строку в файл.
Если хотите записать новую строку в файл, нужно указать символ новой строки. Мы записываем в файл заголовок, за которым следуют дни недели.
iles.py
new_days.write(title) print(title) new_days.write(days) print(days)
Всякий раз, когда мы заканчиваем работу с файлом, нужно его закрыть. Мы покажем это в заключительном шаге.
Чтение и запись файлов
Python предлагает различные методы для чтения и записи файлов, где каждая функция ведет себя по-разному. Следует отметить один важный момент – режим работы с файлами. Чтобы прочитать файл, вам нужно открыть файл в режиме чтения или записи. В то время, как для записи в файл на Python вам нужно, чтобы файл был открыт в режиме записи.
Вот некоторые функции Python, которые позволяют читать и записывать файлы:
- read() – эта функция читает весь файл и возвращает строку;
- readline() – эта функция считывает строки из этого файла и возвращает их в виде строки. Он выбирает строку n, если она вызывается n-й раз.
- readlines() – эта функция возвращает список, в котором каждый элемент представляет собой одну строку этого файла.
- readlines() – эта функция возвращает список, в котором каждый элемент представляет собой одну строку этого файла.
- write() – эта функция записывает фиксированную последовательность символов в файл.
- Writelines() – эта функция записывает список строк.
- append() – эта функция добавляет строку в файл вместо перезаписи файла.
Возьмем пример файла «abc.txt» и прочитаем отдельные строки из файла с помощью цикла for:
#open the file text_file = open('/Users/pankaj/abc.txt','r') #get the list of line line_list = text_file.readlines(); #for each line from the list, print the line for line in line_list: print(line) text_file.close() #don't forget to close the file
Вывод:
Теперь, когда мы знаем, как читать файл в Python, давайте продвинемся вперед и выполним здесь операцию записи с помощью функции Writelines().
#open the file text_file = open('/Users/pankaj/file.txt','w') #initialize an empty list word_list= [] #iterate 4 times for i in range (1, 5): print("Please enter data: ") line = input() #take input word_list.append(line) #append to the list text_file.writelines(word_list) #write 4 words to the file text_file.close() #don’t forget to close the file
Вывод
Обработка PDF документов
В Linux для работы с файлами PDF всё проще, есть мощные инструменты командной строки, такие как и . Но, поскольку, PDF — межплатформенный открытый формат электронных документов, хотелось бы с таким же удобством работать и в Windows, и в macOS. При этого нужна фантазия и усилия разработчика. Вот и совсем недавно встретилась задачка переноса информации из PDF‑файла в базу данных. Естественно, задача автоматизации здесь имеет свою уникальную специфику и без разработки здесь ну совсем никак.
Это руководство — начало небольшой серии, где будут рассмотрены полезные для разработчика библиотеки, позволяющие создавать собственные скрипты Python для решения рутинных задач автоматизации
В первой части внимание сконцентрировано на манипулировании существующими PDF‑файлами. Вы узнаете, как читать и извлекать содержимое (текст и изображения) и разбивать документы на отдельные страницы
Вторая часть будет посвящена наложению водяных знаков в документ. Третья часть посвящена исключительно написанию/созданию PDF‑файлов, а также удалению и повторному объединению отдельных страниц в новый документ.
Чтение текстовых файлов построчно
До сих пор в примерах мы читали весь файл сразу. Чтение полного файла не имеет большого значения для маленьких файлов, но, вообще говоря, это не очень хорошая идея. С одной стороны, если ваш файл больше, чем объем доступной памяти, вы столкнетесь с ошибкой.
Почти в каждом случае лучше читать текстовые файлы по одной строке за раз.
В Python файловый объект является итератором. Итератор — это тип объекта Python, который ведет себя определенным образом при многократном использовании. Например, вы можете использовать цикл for для многократной работы с файловым объектом, и каждый раз, когда выполняется одна и та же операция, вы получите другой, или «следующий», результат.
Для текстовых файлов объект файла повторяет одну строку текста за раз. Он считает одну строку текста «единицей» данных, поэтому мы можем использовать оператор цикла for … in для итерации данных по одной строке за раз:
с открытым ('lorem.txt', 'rt') в качестве myfile: # Откройте файл lorem.txt для чтения текста для myline в myfile: # Для каждой строки прочитайте его в строку print (myline) # напечатайте эту строку, повторите
Выход
Lorem Ipsum Dolor Sit Amet, Concetetur Adipiscing Elit. Mauris nec maximus purus. Меценаты сидят на месте. Quisque в dignissim lacus.
Обратите внимание, что мы получаем дополнительный разрыв строки («новая строка») после каждой строки. Это потому, что печатаются две новые строки
Первый — это новая строка в конце каждой строки нашего текстового файла. Второй перевод строки происходит потому, что по умолчанию print () добавляет собственный разрыв строки в конце того, что вы просили напечатать.
Давайте сохраним наши строки текста в переменной, в частности, в переменной списка, чтобы мы могли взглянуть на нее более внимательно.
Форматы файлов в Python 3
Python очень гибкий и может относительно легко обрабатывать множество различных форматов файлов. Вот основные форматы:
Формат | Описание |
txt | Обычный текстовый файл, который хранит данные в виде символов (или строк) и исключает структурированные метаданные. |
CSV | Файл, который хранит данные в виде таблицы; для структурирования хранимых данных используются запятые (или другие разделители). |
HTML | Файл Hypertext Markup Language хранит структурированные данные; такие файлы используются большинством сайтов. |
JSON | Простой файл JavaScript Object Notation, один из наиболее часто используемых форматов для хранения и передачи данных. |
Данное руководство рассматривает только формат txt.
Разделение PDF‑файлов на страницы с помощью PyPDF2
Для этого примера, в первую очередь необходимо импортировать классы и . Затем мы открываем файл PDF, создаем объект для чтения и перебираем все страницы, используя метод объекта для чтения .
Внутри цикла мы создаем новый экземпляр , который еще не содержит страниц. Затем мы добавляем текущую страницу к нашему объекту записи, используя метод . Этот метод принимает объект страницы, который мы получаем, используя метод .
Следующим шагом является создание уникального имени файла, что мы делаем, используя исходное имя файла плюс слово «page» плюс номер страницы. Мы добавляем 1 к текущему номеру страницы, потому что PyPDF2 считает номера страниц, начиная с нуля.
Наконец, мы открываем новое имя файла в режиме (режиме ) записи двоичного файла и используем метод класса для сохранения извлеченной страницы на диск.
Листинг 4: Разделение PDF на отдельные страницы.
from PyPDF2 import PdfFileReader, PdfFileWriter pdf_document = "source/Computer-Vision-Resources.pdf" pdf = PdfFileReader(pdf_document) for page in range(pdf.getNumPages()): pdf_writer = PdfFileWriter() current_page = pdf.getPage(page) pdf_writer.addPage(current_page) outputFilename = "dist/Computer-Vision-Resources-page-{}.pdf".format(page + 1) with open(outputFilename, "wb") as out: pdf_writer.write(out) print("created", outputFilename)
Разделили исходный файл на страницы
Как читать файл по частям
Самый простой способ для выполнения этой задачи – использовать цикл. Сначала мы научимся читать файл строку за строкой, после этого мы будем читать по килобайту за раз. В нашем первом примере мы применим цикл:
Python
handle = open(«test.txt», «r»)
for line in handle:
print(line)
handle.close()
1 2 3 4 5 6 |
handle=open(«test.txt»,»r») forline inhandle print(line) handle.close() |
Таким образом мы открываем файл в дескрипторе в режиме «только чтение», после чего используем цикл для его повторения
Стоит обратить внимание на то, что цикл можно применять к любым объектам Python (строки, списки, запятые, ключи в словаре, и другие). Весьма просто, не так ли? Попробуем прочесть файл по частям:
Python
handle = open(«test.txt», «r»)
while True:
data = handle.read(1024)
print(data)
if not data:
break
1 2 3 4 5 6 7 8 |
handle=open(«test.txt»,»r») whileTrue data=handle.read(1024) print(data) ifnotdata break |
В данном примере мы использовали Python в цикле, пока читали файл по килобайту за раз. Как известно, килобайт содержит в себе 1024 байта или символов. Теперь давайте представим, что мы хотим прочесть двоичный файл, такой как PDF.
Всё же, что такое Python?¶
Python — это вещь, называемая языком программирования. Она принимает текст (обычно называемый кодом), который ты написал, переводит его в инструкции для компьютера, которые затем исполняет. Мы будем учиться писать код, чтобы делать клёвые и полезные вещи. Отныне вы не обязаны использовать чужие программы, чтобы выполнять работу на компьютере!
В действительности, Python – всего лишь ещё одна программа на твоём компьютере. Для начала нужно узнать, как использовать и взаимодействовать с ним. Существует много способов научиться этому, первый из которых – работать и интерпретатором Python, используя консоль операционной системы (ОС).
Консоль (“терминал”, “командная строка”) – это текстовый (в отличие от так называемых “окружений рабочего стола” (Desktop Environment, DE), работающих в связке с мышью) интерфейс для работы с ОС.
Открываем консоль в Mac OS X
Стандартная консоль OS X зовётся Терминалом, который можно найти с помощью поиска (правый верхний угол) по системе или в разделе Приложения -> Утилиты .
Командная строка Terminal — это инструмент для “общения” с компьютером. Открывшееся окно должно содержать сообщение-подсказку, что-то вроде этого:
mycomputer:~ myusername$
Открываем консоль в GNU/Linux
В дистрибутивах GNU/Linux (Ubuntu, Fedora, Mint и т.д.) обычно уже установлены разные программы-консоли, обычно называемые терминалами. То, какой терминал установлен, зависит от используемого дистрибутива. Например, в Ubuntu это Gnome Terminal. После запуска появляется приглашение вроде этого:
myusername@mycomputer:~$
Пишем в файлах в Python
Как вы могли догадаться, следуя логике написанного выше, режимы написания файлов в Python это “w” и “wb” для write-mode и write-binary-mode соответственно
Теперь давайте взглянем на простой пример того, как они применяются.ВНИМАНИЕ: использование режимов “w” или “wb” в уже существующем файле изменит его без предупреждения. Вы можете посмотреть, существует ли файл, открыв его при помощи модуля ОС Python
Python
handle = open(«output.txt», «w»)
handle.write(«This is a test!»)
handle.close()
1 2 3 |
handle=open(«output.txt»,»w») handle.write(«This is a test!») handle.close() |
Вот так вот просто. Все, что мы здесь сделали – это изменили режим файла на “w” и указали метод написания в файловом дескрипторе, чтобы написать какой-либо текст в теле файла. Файловый дескриптор также имеет метод writelines (написание строк), который будет принимать список строк, который дескриптор, в свою очередь, будет записывать по порядку на диск.
Подготовка
Перед тем, как начать урок, желательно создать один или несколько бинарных файлов, чтобы воспользоваться скриптом из примера. Ниже представлены два скрипта на Python, которые создадут два бинарника. Файл binary1.py создаёт string.bin, содержащий строковые данные, а binary2.py – number_list.bin со списком из числовых данных.
Binary1.py
# Создаём бинарный файл file_handler = open("string.bin", "wb") # Добавляем две строки в бинарный файл file_handler.write(b"Welcome to LinuxHint.\nLearn Python Programming.") # Закрываем чтение file_handler.close()
Binary2.py
# Создаём бинарный файл file=open("number_list.bin","wb") # Объявляем список с числовыми данными numbers= # Конвертируем список в массив barray=bytearray(numbers) # Записываем массив в файл file.write(barray) file.close()
Открытые файлы в Python
Чтобы открыть файл, все, что нам нужно, это путь к каталогу, в котором находится файл. Если он находится в том же каталоге, то это, в том числе только полное имя файла будет достаточно.
Я создал файл с некотором образец текста в нем, который мы будем использовать в качестве образца для изучения метода открытого файла.
1. Открытие файла с помощью метода Open ()
Чтобы открыть OpenFile.txt и прочитайте текстовое содержимое файла, давайте использовать и методы.
file = open('OpenFile.txt') print(file.read()) file.close()
Метод будет прочитать все содержимое файла.
По умолчанию Метод открывает файл в режиме только для чтения. Чтобы написать в файл, нам нужно указать, что файл должен быть открыт в режиме записи.
2. Разные режимы для Open () метода
Давайте попробуем написать файл с режимом по умолчанию.
file = open('OpenFile.txt') print(file.read()) file.write("testing write") file.close()
Мы будем держать операцию чтения, так как это так, чтобы мы могли видеть, где код останавливается.
Так что, что такое режимы, и как мы их добавляем? Ниже приведен список режимов при использовании метода Open ().
- R : Режим только для чтения.
- R +: Режим прочитанного и записи. Не будет создавать новый файл и открыть не удастся, если файл не существует
- RB : Двоичный режим только для чтения для чтения изображений, видео и т. Д.
- W: Режим только для записи. Перезаписывает существующий файл содержимого. Это создаст новый файл, если указанное имя файла не существует.
- W +: Режим прочитанного и записи.
- WB: Двоичный режим только для записи в Media файлы.
- WB +: Двоичный режим чтения и записи.
- A: Режим добавления. Не перезаписывает существующий контент
- A +: Присоединяйтесь и читайте режим. Он создаст новый файл, если имя файла не существует.
- AB: Добавьте двоичный режим для изображений, видео и т. Д.
- AB +: Добавьте и читайте двоичный режим.
3. Открытие файлов в режиме записи в Python
Есть несколько способов открыть файл в режиме записи в Python. В зависимости от того, как вы хотите, чтобы методы обработки файлов писать в файл, вы можете использовать один из режимов ниже.
file = open('OpenFile.txt', 'w') print(file.read()) file.close()
Добавляя «W» при открытии файла в первой строке, мы указываем, что файл должен быть открыт в режиме записи. Но Эта операция потерпит неудачу ТОО Потому что файл – только для записи И не позволит нам использовать метод чтения ().
file = open('OpenFile.txt', 'w') file.write('New content\n') file.close()
Приведенный выше код полностью очистит все содержимое текстового файла и вместо этого просто сказать «новый контент».
Если вы не хотите перезаписать файл, Вы можете использовать А + или R + Режимы.
Режим R + напишет любой контент, переданный на метод.
file = open('OpenFile.txt', 'r+') print(file.read()) file.write('r+ method, adds a line\n') file.close()
Режим A или A + будет выполнять то же действие, что и режим R + с одним главным отличием.
В случае метода R +, Новый файл не будет создан Если указанное имя файла не существует. Но с помощью режима A + новый файл будет создан, если указанный файл недоступен.
4. Открытие файлов с использованием предложения
При чтении файлов с Метод, вам всегда нужно убедиться, что Метод называется, чтобы избежать утечек памяти. Как разработчик, вы можете пропустить при добавлении Метод, вызывающий вашу программу утечку памяти файла из-за открытия файла.
С меньшими файлами, на системных ресурсах не очень заметное влияние, но он будет отображаться при работе с большим файлами.
with open('OpenFile.txt', 'r+') as file: print(file.read())
В приведенном выше примере вывод будет таким же, как те, которые мы видели в начале, но нам не нужно закрывать файл.
А Блок получает блокировку, как только он выполняется и выпускает блокировку после окончания блока.
Вы также можете запустить другие методы на данных во время пребывания в с код кода. Я отредактировал OpenFile.txt, в этом случае и добавил еще несколько текстов для лучшего понимания.
with open('OpenFile.txt', 'r+') as file: lines = file.readlines() for line in lines: print(line.split())
Заявление делает память для нас, пока мы продолжаем работать в его объеме. Это еще один, но лучший способ работать с файлами в Python.
Чтение данных из файла с помощью Python
Допустим, вы (или ваш пользователь посредством вашего приложения) поместили данные в файл, и ваш код должен их получить. Тогда перед вами стоит цель – прочитать файл. Логика чтения такая же, как логика записи:
- Открыть файл
- Прочесть данные
- Закрыть файл
Опять же, этот логический поток отражает то, что вы и так делаете постоянно, просто используя компьютер (или читая книгу, если на то пошло). Чтобы прочитать документ, вы открываете его, читаете и закрываете. С компьютерной точки зрения «открытие» файла означает загрузку его в память.
На практике текстовый файл содержит более одной строки. Например, вашему коду может потребоваться прочитать файл конфигурации, в котором сохранены данные игры или текст следующей песни вашей группы. Так же, как вы не прочитываете всю книгу прямо в момент открытия, ваш код не должен распарсить весь файл целиком при загрузке в память. Вероятно, вам потребуется перебрать содержимое файла.
f = open('example.tmp', 'r') for line in f: print(line) f.close()
В первой строке данного примера мы открываем файл в режиме чтения. Файл обозначаем переменной , но, как и при открытии файлов для записи, имя переменной может быть произвольным. В имени нет ничего особенного – это просто кратчайший из возможных способов представить слово file, поэтому программисты Python часто используют его.
Во второй строке мы резервируем (еще одно произвольное имя переменной), для представления каждой строки . Это сообщает Python, что нужно выполнить итерацию по строкам нашего файла и вывести каждую из них на экран.
Чтение файла с использованием конструкции with
Как и при записи данных, существует более короткий метод чтения из файлов с использованием конструкции . Поскольку здесь не требуется вызов функции , это более удобно для быстрого взаимодействия.
with open('example.txt', 'r') as f: for line in f: print(line)