Работа с файлами в Python
Introduction | |
Создать | |
Открыть | |
Закрыть | |
Менеджер контекста | |
Копировать файл | |
Запись в файл | |
Дописать к файлу | |
Записать json в файл | |
Удалить первые несколько строк файла | |
Запись вывода программы в файл |
Introduction
В этой статье вы узнаете как организовать работать с файлами в Python 3.
Создайте файл
files.py
и копируйте туда код из примеров.
Запустить файл можно командой
python3 files.py
Создать
Создать файл можно командой
open
Опции:
r чтение
rb чтение в бинарном режиме
w только запись.
wb запись в бинарном режиме
w+ запись и чтение
a запись в конец файла - сохранит данные, которые были в файле
Любая опция с w перезапишет существующий файл - будьте внимательны!
Пример:
f = open("log.txt","w+")
Открыть файл
To открыть файл для чтения execute
f = open("log.txt","r")
Если файл log.txt не существует, он не будет создан
raceback (most recent call last): File "files.py", line 1, in <module> f = open('log.txt', 'r') FileNotFoundError: [Errno 2] No such file or directory: 'log.txt'
Закрыть файл
To закрыть файл execute
f.close()
Имя файла
Пример программы, которая выводит на экран имя файла и режим, в котором он открыт
f = open('text.txt', 'r')
print(f.name)
print(f.mode)
f.close()
Если файл log.txt существует, то в терминале вы увидите
text.txt
r
Менеджер контекста
Предпочтительнее использовать менеджер контекста для работы с файлами
Как только вы выйдете из блока в котором открыт файл - он автоматически закроется
with open('text.txt', 'r') as f:
pass
print(f.closed)
True
Прочитать содержимое файла
with open('sites.txt', 'r') as f:
f_contents = f.read()
print(f_contents)
www.eth1.ru www.heihei.ru www.topbicycle.ru
Все строки с символом перехода на новую строку - readlines
with open('sites.txt', 'r') as f:
f_contents = f.readlines()
print(f_contents)
['www.eth1.ru\n', 'www.heihei.ru\n', 'www.topbicycle.ru\n']
Строки по одной readline
with open('sites.txt', 'r') as f:
f_contents = f.readline()
print(f_contents)
f_contents = f.readline()
print(f_contents)
www.eth1.ru www.heihei.ru
Строки по одной без лишних переходов end=''
with open('sites.txt', 'r') as f:
f_contents = f.readline()
print(f_contents, end = '')
f_contents = f.readline()
print(f_contents, end = '')
www.eth1.ru www.heihei.ru
Цикл для построчного вывода
with open('sites.txt', 'r') as f:
for line in f:
print(line, end = '')
www.eth1.ru www.heihei.ru www.topbicycle.ru
Прочитать определённое количество символов
with open('sites.txt', 'r') as f:
f_contents = f.read(20)
print(f_contents)
www.eth1.ru www.heihe
Если выполнять эту команду последовательно - будут прочитаны следующие символы
with open('sites.txt', 'r') as f:
f_contents = f.read(20)
print(f_contents, end = '')
f_contents = f.read(20)
print(f_contents, end = '')
www.eth1.ru www.heihei.ru www.topbicycle.
Цикл для произвольного количества символов .read
with open('sites.txt', 'r') as f:
size_to_read = 10
f_contents = f.read(size_to_read)
while len(f_contents) > 0:
print(f_contents, end = '')
f_contents = f.read(size_to_read)
www.eth1.ru www.heihei.ru www.topbicycle.ru
Выражение f_contents = f.read(size_to_read) нужно для того, чтобы когда файл закончится и f.read(size_to_read) станет нулем len(f_contents) тоже станет нулем и цикл завершится
Перейти в произвольное место
seek
Например, вернуться в начало файла
f.seek(0)
Копирование файлов
Текстовые файлы
Их можно копировать построчно
with open('sites.txt', 'r') as rf:
with open('sites_copy.txt', 'w') as wf:
for line in rf:
wf.write(line)
cat sites_copy.txt
www.eth1.ru www.heihei.ru www.topbicycle.ru
Изображения
Их тоже можно копировать построчно, но открывать
и записывать нужно в побитовом режиме. То есть
нужно добавлять опцию b
Скачайте изображение велосипеда с сайта
TopBicycle.ru
или возьмите любую другую картинку
wget https://topbicycle.ru/b/img/stels_pilot_950_MD_26.jpg
ls
stels_pilot_950_MD_26.jpg
with open('stels_pilot_950_MD_26.jpg', 'rb') as rf:
with open('stels_pilot_950_MD_26_copy.jpg', 'wb') as wf:
for line in rf:
wf.write(line)
python3 files.py
ls
stels_pilot_950_MD_26.jpg stels_pilot_950_MD_26_copy.jpg
Более правильным подходом считается копирование не в построчном режиме а частями с фиксированным размером
with open('stels_pilot_950_MD_26.jpg', 'rb') as rf:
with open('stels_pilot_950_MD_26_copy.jpg', 'wb') as wf:
chunk_size = 4096
rf_chunk = rf.read(chunk_size)
while len(rf_chunk) > 0:
wf.write(rf_chunk)
rf_chunk = rf.read(chunk_size)
Записать файл
To очистить файл от старого содержимого и записать в него новое используется опция w (write)
with open('log.txt', 'w') as f:
f.write("some text")
Дописать в файл
Если нужно добавить новые данные к предыдущему содержимому без удаления - используется опция a (append)
with open('log.txt', 'a') as f:
f.write("some text")
Записать json в файл
import json
# нужно где-то взять json
r = urllib.request.urlopen('http://eth1.ru/api/v1/getjson')
rr = r.read()
rj = json.loads(rr)
with open('file.txt', 'w') as f:
json.dump(rj, f)
Удалить первые несколько строк файла
with open('log.txt', 'a') as fin:
data = fin.readlines()[1:]
with open('new.txt', 'w') as fout:
fout.writelines(data)
Запись вывода программы в файл
Если вы запускаете скрипт из терминала, воспользуйтесь перенаправлением
python script.py > script.log
В самом скрипте можно временно подменить стандартный вывод.
Допустим я делаю запрос к API
(Подробнее про REST API)
import sys … # Сохраним ссылку на оригинальный stdout original_stdout = sys.stdout with open("log.txt", "a") as f: sys.stdout = f print(resp.data) sys.stdout = original_stdout
Тоже самое, если приходит json и хочется записать его красиво
import sys import json … with open("log.txt", "a") as f: sys.stdout = f print(json.dumps(resp.data, indent=4)) sys.stdout = original_stdout