Автор оригинала: Frank Hofmann.
Написание файлов с помощью Python
Как указывалось в предыдущей статье , посвященной чтению данных из файлов, обработка файлов относится к основным знаниям каждого профессионального программиста Python. Эта функция является основной частью языка Python, и для ее правильной работы не требуется загружать дополнительный модуль.
Основы написания файлов на Python
Наиболее распространенными методами работы с файлами являются open()
открытие файла, seek()
установка текущего положения файла при заданном смещении и close()
последующее закрытие файла. Метод open()
возвращает дескриптор файла, представляющий объект file , который будет использоваться для доступа к файлу для чтения, записи или добавления.
Запись в файл требует нескольких решений – имя файла, в котором хранятся данные, и режим доступа к файлу. Доступны два режима: запись в новый файл (и перезапись любых существующих данных) и добавление данных в конец уже существующего файла. Соответствующие аббревиатуры – “w” и “a” – должны быть указаны перед открытием файла.
В этой статье мы объясним, как записывать данные в файл построчно, в виде списка строк, и добавлять данные в конце файла.
Запись одной строки в файл
Этот первый пример очень похож на запись в файлы с популярными языками программирования C и C++, как вы увидите в Листинге 1 . Процесс довольно простой. Сначала мы открываем файл с помощью метода open()
для записи, записываем в файл одну строку текста с помощью метода write ()
, а затем закрываем файл с помощью метода close ()
. Имейте в виду, что из-за того, как мы открыли “helloworld.txt” файл будет либо создан, если он еще не существует, либо он будет полностью перезаписан.
filehandle = open('helloworld.txt', 'w') filehandle.write('Hello, world!\n') filehandle.close()
Листинг 1
Весь этот процесс можно сократить с помощью оператора with
. Листинг 2 показывает, как это написать. Как уже было сказано ранее имейте в виду, что, открывая “helloworld.txt” файл таким образом будет либо создан, если он еще не существует, либо полностью перезаписан, в противном случае.
with open('helloworld.txt', 'w') as filehandle: filehandle.write('Hello, world!\n')
Листинг 2
Запись списка строк в файл
На самом деле файл состоит не только из одной строки, но и из гораздо большего количества данных. Таким образом, содержимое файла хранится в списке, который представляет собой буфер файла. Для записи всего буфера файла мы будем использовать метод writeline ()
. Листинг 3 дает вам пример этого.
filehandle = open("helloworld.txt", "w") filebuffer = ["a first line of text", "a second line of text", "a third line"] filehandle.writelines(filebuffer) filehandle.close()
Листинг 3
Запустив программу Python, показанную в Листинге 3 , а затем с помощью команды cat
мы видим, что файл “helloworld.txt” имеет следующее содержание:
$ cat helloworld.txt a first line of texta second line of texta third line
Листинг 4
Это происходит потому, что метод writelines()
не добавляет автоматически никаких разделителей строк при записи данных. Листинг 5 показывает, как этого добиться, записывая каждую строку текста в одну строку, добавляя разделитель строк “\n”. Используя выражение генератора, каждая строка заменяется разделителем строки плюс строка. Опять же, вы можете сформулировать это с помощью оператора with
.
with open('helloworld.txt', 'w') as filehandle: filebuffer = ["a line of text", "another line of text", "a third line"] filehandle.writelines("%s\n" % line for line in filebuffer)
Листинг 5
Теперь, выходной файл “helloworld.txt” имеет желаемое содержание, как показано в Листинге 6 :
$ cat helloworld.txt a first line of text a second line of text a third line
Листинг 6
Интересно, что есть способ использовать перенаправление вывода в Python для записи данных в файлы. Листинг 7 показывает, как это сделать для Python 2.x.
# define the name of the output file filename = "helloworld.txt" # define content filecontent = ["Hello, world", "a second line", "and a third line"] with open(filename, 'w') as filehandle: # redirect the output of print to the file handle for line in filecontent: print >>filehandle, line
Листинг 7
Для последних версий Python это больше не работает таким же образом. Чтобы сделать что-то подобное, мы должны использовать модуль sys
. Он позволяет нам получить доступ к стандартным выходным каналам UNIX через sys.stdout
, sys.stdin
и sys.stderr
. В нашем случае мы сначала сохраняем исходное значение выходного канала sys.stdout
(строка 8 в приведенном ниже коде), переопределяем его на дескриптор нашего выходного файла, затем (строка 15) печатаем данные как обычно (строка 18) и, наконец, восстанавливаем исходное значение выходного канала sys.stdout
(строка 21). Листинг 8 содержит пример кода.
# import sys module import sys # define the name of the output file filename = "helloworld.txt" # preserve the stdout channel original = sys.stdout # define content filecontent = ["Hello, world", "a second line", "and a third line"] with open(filename, 'w') as filehandle: # set the new output channel sys.stdout = filehandle for line in filecontent: print(line) # restore the old output channel sys.stdout = original
Листинг 8
Это не обязательно лучшая практика, но она дает вам другие возможности для записи строк в файл.
Добавление данных в файл
До сих пор мы хранили данные в новых файлах или в перезаписанных данных в существующих файлах. Но что делать, если мы хотим добавить данные в конец существующего файла? В этом случае нам нужно будет открыть существующий файл, используя другой режим доступа. Мы изменим это на “а” вместо “в”. Листинг 9 показывает, как с этим справиться. И Листинг 10 делает то же самое, но он скорее использует оператор with
.
filehandle = open('helloworld.txt','a') filehandle.write('\n' + 'Hello, world!\n') filehandle.close()
Листинг 9
with open('helloworld.txt', 'a') as filehandle: filehandle.write('\n' + 'Hello, world!\n')
Листинг 10
Используя то же самое helloworld.txt файл из предыдущего, запуск этого кода приведет к получению следующего содержимого файла:
$ cat helloworld.txt Hello, world a second line and a third line Hello, world!
Вывод
Запись простых текстовых данных в файлы или добавление данных к существующим файлам так же просто, как чтение из файлов в Python. Как только файл закрывается после записи или добавления данных, Python запускает вызов синхронизации. В результате обновленный файл сразу же записывается на диск.
Рекомендации
- Фрэнк Хофманн: Чтение файлов с помощью Python
- Python 101: Перенаправление stdout
Признание
Автор хотел бы поблагодарить Золеку Хатитонгве за ее поддержку при подготовке статьи.