Рубрики
Без рубрики

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

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

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

Признание

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