Написание файлов с использованием Python

Как указывалось в предыдущей статье, посвященной чтению данных из файлов [/ read-files-with-python /], обработка файлов относится к важным знаниям каждого профессионального программиста Python. Эта функция является основной частью языка Python, и для ее правильной загрузки не требуется загружать дополнительный модуль. Основы написания файлов на Python Распространенными методами работы с файлами являются open (), чтобы открыть файл, seek (), чтобы установить текущую позицию файла по заданному смещению, и close (), чтобы закрыть файл.

Как указывалось в предыдущей статье, посвященной чтению данных из файлов , обработка файлов относится к важным знаниям каждого профессионального программиста 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 запускает вызов синхронизации. В результате обновленный файл сразу же записывается на диск.

Рекомендации

Благодарности

Автор благодарит Золеку Хатитонгве за поддержку при подготовке статьи.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus