Работа с файлами в Python
Введение
В этой статье вы узнаете как организовать работать с файлами в Python 3.
Создайте файл
files.py
и копируйте туда код из примеров.
Запустить файл можно командой
python3 files.py
Введение | |
Создать | |
Открыть | |
Закрыть | |
Менеджер контекста | |
Копировать файл | |
Запись в файл | |
Дописать к файлу | |
Записать json в файл | |
Удалить первые несколько строк файла |
Создать
Создать файл можно командой
open
Опции:
r чтение
rb чтение в бинарном режиме
w только запись.
wb запись в бинарном режиме
w+ запись и чтение
a запись в конец файла - сохранит данные, которые были в файле
Любая опция с w перезапишет существующий файл - будьте внимательны!
Пример:
f = open("log.txt","w+")
Открыть файл
Чтобы открыть файл для чтения выполните
f = open("log.txt","r")
Если файл log.txt не существует, он не будет создан
Traceback (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'
Закрыть файл
Чтобы закрыть файл выполните
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.urn.su www.heihei.ru www.topbicycle.ru
Все строки с символом перехода на новую строку - readlines
with open('sites.txt', 'r') as f:
f_contents = f.readlines()
print(f_contents)
['www.urn.su\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.urn.su 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.urn.su www.heihei.ru
Цикл для построчного вывода
with open('sites.txt', 'r') as f:
for line in f:
print(line, end = '')
www.urn.su www.heihei.ru www.topbicycle.ru
Прочитать определённое количество символов
with open('sites.txt', 'r') as f:
f_contents = f.read(20)
print(f_contents)
www.urn.su 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.urn.su 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.urn.su 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.urn.su 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)
Записать файл
Чтобы очистить файл от старого содержимого и записать в него новое используется опция 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://urn.su/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)