Как указывалось в предыдущей статье, посвященной чтению данных из файлов , обработка файлов относится к важным знаниям каждого профессионального программиста Python. Эта функция является основной частью языка Python, и для ее правильной загрузки не требуется загружать дополнительный модуль.
Основы написания файлов на Python
Общие методы работы с файлами: open()
для открытия файла, seek()
для
установки текущей позиции файла по заданному смещению и close()
для
закрытия файла после этого. Метод open()
возвращает дескриптор файла,
представляющий файловый
объект,
который будет использоваться для доступа к файлу для чтения, записи или
добавления.
Запись в файл требует нескольких решений - имени файла, в котором будут храниться данные, и режима доступа к файлу. Доступны два режима: запись в новый файл (и перезапись любых существующих данных) и добавление данных в конец уже существующего файла. Соответствующие сокращения - «w» и «a», и их необходимо указать перед открытием файла.
В этой статье мы объясним, как записывать данные в файл построчно, как список строк и как добавлять данные в конец файла.
Запись одной строки в файл
Этот первый пример очень похож на запись в файлы с помощью популярных
языков программирования C и C ++, как вы увидите в листинге 1 .
Процесс довольно прост. Сначала мы открываем файл с помощью open()
для
записи, записываем одну строку текста в файл с помощью write()
, а
затем закрываем файл с помощью метода close()
Имейте в виду, что из-за
того, как мы открыли файл helloworld.txt, он либо будет создан, если он
еще не существует, либо будет полностью перезаписан.
filehandle = open('helloworld.txt', 'w')
filehandle.write('Hello, world!\n')
filehandle.close()
Листинг 1
Весь этот процесс можно сократить с with
оператора with. В листинге
2 показано, как это записать. Как уже было сказано ранее, имейте в
виду, что при открытии файла "helloworld.txt" таким образом либо
создается, если он еще не существует, либо он полностью
перезаписывается, в противном случае.
with open('helloworld.txt', 'w') as filehandle:
filehandle.write('Hello, world!\n')
Листинг 2
Запись списка строк в файл
На самом деле файл состоит не из одной строки, а из гораздо большего
количества данных. Таким образом, содержимое файла хранится в списке,
представляющем файловый буфер. Для записи всего файлового буфера
воспользуемся writelines()
. В листинге 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.
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
Это не обязательно лучшая практика, но она дает вам другие возможности для записи строк в файл.
Добавление данных в файл
До сих пор мы сохраняли данные в новых файлах или в перезаписанных
данных в существующих файлах. Но что, если мы хотим добавить данные в
конец существующего файла? В этом случае нам нужно будет открыть
существующий файл, используя другой режим доступа. Мы меняем его на «a»
вместо «w». В листинге 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
Благодарности
Автор благодарит Золеку Хатитонгве за поддержку при подготовке статьи.