Основы работы с файлами в Python
Михаил Свинцов
автор курса «Full-stack веб-разработчик на Python»
Взаимодействие с файловой системой позволяет хранить информацию, полученную в результате работы программы. Михаил Свинцов из SkillFactory расскажет о базовой функциональности языка программирования Python для работы с файлами.
Встроенные средства Python
Основа для работы с файлами — built-in функция open()
open(file, mode="rt")
Эта функция имеет два аргумента. Аргумент file
принимает строку, в которой содержится путь к файлу. Второй аргумент, mode
, позволяет указать режим, в котором необходимо работать с файлом. По умолчанию этот аргумент принимает значение «rt», с которым, и с некоторыми другими, можно ознакомиться в таблице ниже
Эти режимы могут быть скомбинированы. Например, «rb» открывает двоичный файл для чтения. Комбинируя «r+» или «w+» можно добиться открытия файла в режиме и чтения, и записи одновременно с одним отличием — первый режим вызовет исключение, если файла не существует, а работа во втором режиме в таком случае создаст его.
Начать саму работу с файлом можно с помощью объекта класса io.TextIOWrapper
, который возвращается функцией open()
. У этого объекта есть несколько атрибутов, через которые можно получить информацию
name
— название файла;mode
— режим, в котором этот файл открыт;closed
— возвращаетTrue
, если файл был закрыт.
По завершении работы с файлом его необходимо закрыть при помощи метода close()
f = open("examp.le", "w")
// работа с файлом
f.close()
Однако более pythonic way стиль работы с файлом встроенными средствами заключается в использовании конструкции with .. as ..
, которая работает как менеджер создания контекста. Написанный выше пример можно переписать с ее помощью
with open("examp.le", "w") as f:
// работа с файлом
Главное отличие заключается в том, что python самостоятельно закрывает файл, и разработчику нет необходимости помнить об этом. И бонусом к этому не будут вызваны исключения при открытии файла (например, если файл не существует).
Чтение из файла
При открытии файла в режимах, допускающих чтение, можно использовать несколько подходов.
Для начала можно прочитать файл целиком и все данные, находящиеся в нем, записать в одну строку.
with open("examp.le", "r") as f:
text = f.read()
Используя эту функцию с целочисленным аргументом, можно прочитать определенное количество символов.
with open("examp.le", "r") as f:
part = f.read(16)
При этом будут получены только первые 16 символов текста. Важно понимать, что при применении этой функции несколько раз подряд будет считываться часть за частью этого текста — виртуальный курсор будет сдвигаться на считанную часть текста. Его можно сдвинуть на определенную позицию, при необходимости воспользовавшись методом
.
with open("examp.le", "r") as f: # 'Hello, world!'
first_part = f.read(8) # 'Hello, w'
f.seek(4)
second_part = f.read(8) # 'o, world'
Другой способ заключается в считывании файла построчно. Метод readline()
считывает строку и, также как и с методом read()
, сдвигает курсор — только теперь уже на целую строку. Применение этого метода несколько раз будет приводить к считыванию нескольких строк. Схожий с этим способом, другой метод позволяет прочитать файл целиком, но по строкам, записав их в список. Этот список можно использовать, например, в качестве итерируемого объекта в цикле.
with open("examp.le", "r") as f:
for line in f.readlines():
print(line)
Однако и здесь существует более pythonic way. Он заключается в том, что сам объект io.TextIOWrapper
имеет итератор, возвращающий строку за строкой. Благодаря этому нет необходимости считывать файл целиком, сохраняя его в список, а можно динамически по строкам считывать файл. И делать это лаконично.with open("examp.le", "r") as f:
for line in f:
print(line)
Запись в файл
Функциональность внесения данных в файл не зависит от режима — добавление данных или перезаписывание файла. В выполнении этой операции также существует несколько подходов.
Самый простой и логичный — использование функции write()
with open("examp.le", "w") as f:
f.write(some_string_data)
Важно, что в качестве аргумента функции могут быть переданы только строки. Если необходимо записать другого рода информацию, то ее необходимо явно привести к строковому типу, используя методы __str__(self)
Есть возможность записать в файл большой объем данных, если он может быть представлен в виде списка строк.
with open("examp.le", "w") as f:
f.writelines(list_of_strings)
Здесь есть еще один нюанс, связанный с тем, что функции write()
и writelines()
автоматически не ставят символ переноса строки, и это разработчику нужно контролировать самостоятельно.
Существует еще один, менее известный, способ, но, возможно, самый удобный из представленных. И как бы не было странно, он заключается в использовании функции print()
. Сначала это утверждение может показаться странным, потому что общеизвестно, что с помощью нее происходит вывод в консоль. И это правда. Но если передать в необязательный аргумент file
объект типа io.TextIOWrapper
, каким и является объект файла, с которым мы работаем, то поток вывода функции print()
перенаправляется из консоли в файл.
with open("examp.le", "w") as f:
print(some_data, file=f)
Сила такого подхода заключается в том, что в print()
можно передавать не обязательно строковые аргументы — при необходимости функция сама их преобразует к строковому типу.
На этом знакомство с базовой функциональностью работы с файлами можно закончить. Вместе с этим стоит сказать, что возможности языка Python им не ограничивается. Существует большое количество библиотек, которые позволяют работать с файлами определенных типов, а также допускают более тесное взаимодействие с файловой системой. И в совокупности они предоставляют разработчикам легкий и комфортный способ работы с файлами.
Чтение из файла построчно в Python на примерах readline, readlines и цикла for
Существует много способов чтение из файла построчно в Python. Вы можете считать строки в список или обращаться к каждой из строк в цикле при помощи итератора или вызова функции объекта file.
В этом руководстве мы научимся считывать файл построчно, используя функции
, readlines()
и объект файла на примерах различных программ.
Пример 1: Чтение файла построчно функцией readline()
В этом примере мы будем использовать функцию readline()
для файлового объекта, получая каждую строку в цикле.
Как использовать функцию file.readline()
Следуйте пунктам приведенным ниже для того, чтобы считать файл построчно, используя функцию readline()
.
- Открываем файл в режиме чтения. При этом возвращается дескриптор файла.
- Создаём бесконечный цикл while.
- В каждой итерации считываем строку файла при помощи
readline()
. - Если строка не пустая, то выводим её и переходим к следующей. Вы можете проверить это, используя конструкцию
if not
. В противном случае файл больше не имеет строк и мы останавливаем цикл с помощьюbreak
.
- В каждой итерации считываем строку файла при помощи
- К моменту выхода из цикла мы считаем все строки файла в итерациях одну за другой.
- После этого мы закрываем файл, используя функцию
close
.
# получим объект файла
file1 = open("sample.txt", "r")
while True:
# считываем строку
line = file1.readline()
# прерываем цикл, если строка пустая
if not line:
break
# выводим строку
print(line.strip())
# закрываем файл
file1.close
Вывод:
Привет!
Добро пожаловать на PythonRu.
Удачи в обучении!
Пример 2: Чтение строк как список функцией readlines()
Функция readlines()
возвращает все строки файла в виде списка. Мы можем пройтись по списку и получить доступ к каждой строке.
В следующей программе мы должны открыть текстовый файл и получить список всех его строк, используя функцию readlines()
. После этого мы используем цикл for, чтобы обойти данный список.
# получим объект файла
file1 = open("sample.txt", "r")
# считываем все строки
lines = file1.readlines()
# итерация по строкам
for line in lines:
print(line.strip())
# закрываем файл
file1.close
Привет!
Добро пожаловать на PythonRu.
Удачи в обучении!
Пример 3: Считываем файл построчно из объекта File
В нашем первом примере, мы считываем каждую строку файла при помощи бесконечного цикла while и функции readline()
. Но Вы можете использовать цикл for для файлового объекта, чтобы в каждой итерации цикла получать строку, пока не будет достигнут конец файла.
Ниже приводится программа, демонстрирующая применение оператора for-in, для того, чтобы перебрать строки файла.
Для демонстрации откроем файл с помощью with open. Это применимо и к предыдущим двум примерам.
# получим объект файла
with open("sample.txt", "r") as file1:
# итерация по строкам
for line in file1:
print(line.strip())
Привет!
Добро пожаловать на PythonRu.
Удачи в обучении!
Выводы
В этом руководстве мы научились считывать текстовый файл построчно с помощью примеров программ на Python.
Чтение данных из файла и запись в файл
Создание файла
В Python, чтобы создать файл, надо его открыть в режиме записи (‘w’, ‘wb’) или дозаписи (‘a’, ‘ab’).
f2 = open("text2.txt", 'w')
Функция open() возвращает файловый объект.
Без ‘b’ создается текстовый файл, представляющий собой поток символов. С ‘b’ — файл, содержащий поток байтов.
В Python также существует режим ‘x’ или ‘xb’. В этом режиме проверяется, есть ли файл. Если файл с определенным именем уже существует, он не будет создан. В режиме ‘w’ файл создается заново, старый при этом теряется.
>>> f1 = open('text1.txt', 'w') >>> f2 = open('text1.txt', 'x') Traceback (most recent call last): File "<stdin>", line 1, in <module> FileExistsError: [Errno 17] File exists: 'text1.txt' >>> f3 = open('text1.txt', 'w')
Чтение данных из файла
Если в функцию open() не передается второй аргумент, файл расценивается как текстовый и открывается на чтение.
Попытка открыть на чтение несуществующий файл вызывает ошибку.
>>> f = open("text10.txt")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'text10.txt'
Перехватить возникшее исключение можно с помощью конструкции try-except.
>>> try:
... f = open("text10.txt")
... except IOError:
... print ("No file")
...
No file
Получить все данные из файла можно с помощью метода read() файлового объекта, предварительно открыв файл на чтение. При этом файловый объект изменяется и получить из него данные еще раз не получится.
>>> f = open("text.txt")
>>> f
<_io.TextIOWrapper name='text.txt' mode='r' encoding='UTF-8'>
>>> fd = f.read()
>>> fd1 = f.read()
>>> fd
'Hello\n\tOne\n Two\nThree Four\nШесть!\n'
>>> fd1
''
Методу read() может быть передан один аргумент, обозначающий количество байт для чтения.
>>> f = open("text.txt")
>>> fd = f.read(10)
>>> fd1 = f.read(5)
>>> fd
'Hello\n\tOne'
>>> fd1
'\n T'
Метод readline() позволяет получать данные построчно.
>>> f = open("text.txt")
>>> f.readline()
'Hello\n'
>>> f.readline()
'\tOne\n'
>>> f.readline()
' Two\n'
Принимает аргумент — число байт.
>>> f.readline(3)
'Thr'
>>> f.readline(3)
'ee '
>>> f.readline(3)
'Fou'
>>> f.readline(3)
'r\n'
>>> f.readline(5)
'Шесть'
>>> f.readline(5)
'!\n'
Метод readlines() считывает все строки и помещает их в список.
>>> f = open("text.txt")
>>> fd = f.readlines()
>>> fd
['Hello\n', '\tOne\n', ' Two\n', 'Three Four\n', 'Шесть!\n']
Может принимать количество байт, но дочитывает строку до конца.
>>> f = open("text.txt")
>>> fd = f.readlines(3)
>>> fd
['Hello\n']
>>> fd1 = f.readlines(6)
>>> fd1
['\tOne\n', ' Two\n']
Запись данных в файл
Записать данные в файл можно с помощью метода write(), который возвращает число записанных символов.
>>> f1 = open("text1.txt", 'w')
>>> f1.write("Table, cup.\nBig, small.")
23
>>> a = f1.write("Table, cup.\nBig, small.")
>>> type(a)
<class 'int'>
Файл, открытый на запись, нельзя прочитать. Для этого требуется его закрыть, а потом открыть на чтение.
>>> f1.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
io.UnsupportedOperation: not readable
>>> f1.close()
>>> f1 = open("text1.txt", 'r')
>>> f1.read()
'Table, cup.\nBig, small.Table, cup.\nBig, small.'
С помощью метода writelines() можно записать в файл итерируемую последовательность.
>>> a = [1,2,3,4,5,6,7,8,9,0]
>>> f = open("text2.txt",'w')
>>> f.writelines("%s\n" % i for i in a)
>>> f.close()
>>> open("text2.txt").read()
'1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n'
>>> print(open("text2.txt").read())
1
2
3
4
5
6
7
8
9
0
Смена позиции в файле
>>> f = open('text.txt')
>>> f.read()
'Hello\n\tOne\n Two\nThree Four\nШесть!\n'
>>> f.close()
>>> f = open('text.txt')
>>> f.seek(10)
10
>>> f.read()
'\n Two\nThree Four\nШесть!\n'
Двоичные файлы
Пример копирования изображения:
>>> f1 = open('flag.png', 'rb')
>>> f2 = open('flag2.png', 'wb')
>>> f2.write(f1.read())
446
>>> f1.close()
>>> f2.close()
Модуль struct позволяет преобразовывать данные к бинарному виду и обратно.
>>> f = open('text3.txt', 'wb')
>>> f.write('3')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' does not support the buffer interface
>>> d = struct.pack('>i',3)
>>> d
b'\x00\x00\x00\x03'
>>> f.write(d)
4
>>> f.close()
>>> f = open('text3.txt')
>>> d = f.read()
>>> d
'\x00\x00\x00\x03'
>>> struct.unpack('>i',d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' does not support the buffer interface
>>> f = open('text3.txt', 'rb')
>>> d = f.read()
>>> d
b'\x00\x00\x00\x03'
>>> struct.unpack('>i',d)
(3,)
Python 3-чтение текста из файла
Это упражнение 15 из Learn Python The Hard Way, но я использую Python 3 .
from sys import argv
script, filename = argv
txt = open(filename)
print ("Here's your file %r:") % filename
print txt.read()
print ("I'll also ask you to type it again:")
file_again = input()
txt_again = open(file_again)
print txt_again.read()
файл сохраняется как ex15.py, и когда я запускаю его из terminal, он читает ex15.txt правильно в первый раз, но когда я запрашиваю его во второй раз, я получаю ошибку
user@user:~/Desktop/python$ python ex15.py ex15.txt<br>
Here's your file 'ex15.txt':<br>
This is stuff I typed into a file.<br>
It is really cool stuff.<br>
Lots and lots of fun to have in here.<br>
I'll also ask you to type it again:<br>
ex15.txt <b>#now I type this in again, and I get a following error</b><br>
Traceback (most recent call last):<br>
File "ex15.py", line 11, in <<module>module><br>
file_again = input()<br>
File "<<string\>string>", line 1, in <<module>module><br>
NameError: name 'ex15' is not defined
— Что случилось?
python python-3.xПоделиться Источник JohnSmith 18 октября 2012 в 22:17
4 ответа
- Python; чтение файла и поиск нужного текста
Нужно создать функцию с двумя парами, именем файла для открытия и шаблоном. Шаблон будет строкой поиска. Например, функция откроет sentence.txt, который имеет что-то вроде The quick brown fox (возможно, это может быть более одной строки) Шаблон будет brown fox Поэтому, если он найден, как это…
- Чтение списка из файла в python
У меня есть файл, из которого в каждой строке содержится следующее: имя файла, длина списка, фактический список. Вот пример: a.txt 3 [4,2,9] b.txt 5 [1,6,5,2,8] c.txt 7 [1,2,3,4,5,6,7] и так далее. Мне удалось прочитать все до списка, но список читается как строки. Например, для первого из них…
7
Вы определенно не используете Python 3. Есть пара вещей, которые делают это очевидным:
Эти операторы
print
не имеют круглых скобок (которые требуются в Python 3, но не 2):print ("Here's your file %r:") % filename print txt.read() print txt_again.read()
Это вызов
eval
наinput()
, который был изменен в Python 3 :file_again = input()
Скорее всего, Python 2-это значение по умолчанию в вашей системе, но вы можете сделать так, чтобы ваш скрипт всегда использовал Python 3, добавив его в первую строку вашего скрипта (если вы запускаете его напрямую, например ./myscript.py
):
#!/usr/bin/env python3
Или запустить его явно с Python 3:
python3 myscript.py
Еще одно замечание: вы должны действительно закрыть файл, когда закончите с ним. Вы можете сделать это явно:
txt = open(filename)
# do stuff needing text
txt.close()
Или используйте оператор with
и обработайте его, когда блок закончится:
with open(filename) as txt:
# do stuff needing txt
# txt is closed here
Поделиться Brendan Long 18 октября 2012 в 22:27
5
Ваше заявление о печати предполагает, что вы не используете py3k, как вы сказали в своем названии.
print txt.read()
это не работает в py3k, поэтому убедитесь, что вы действительно используете py3k.
вам нужно использовать raw_input()
вместо input()
, потому что вы находитесь на py 2.x
.
пример py 2.x:
>>> x=raw_input()
foo
>>> x=input() # doesn't works as it tries to find the variable bar
bar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'bar' is not defined
пример py 3.x:
>>> x=input()
foo
>>> x # works fine
'foo'
Поделиться Ashwini Chaudhary 18 октября 2012 в 22:21
3
Похоже, вы не используете python 3.0.. чтобы проверить это, просто введите в окно terminal:
python
и посмотрите на информационные строки, которые появляются при запуске интерператора.
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel
32
Type "help", "copyright", "credits" or "license" for more information.
Это должно быть что-то вроде этого,
для python 2.7.3
, а для python 3.X.X
вместо этого будет сказано python 3.X.X
.
Если вы используете python 2.X, Ashwini Chaudhary
имеет правильный ответ.
Поделиться Serdalis 18 октября 2012 в 22:25
- Python чтение файла перемотка назад
Чтение файла с помощью Python. Формат файла выглядит следующим образом: [22/Oct/2013] GET KEYWORD apple/banana/tomato ID=23q539283492u39 ERROR:2 ERROR:3 parameters={} … Меня интересуют только все ERROR:3, поэтому, как только будет замечен ERROR:3, необходимо извлечь первую строку (время и…
- Чтение файла .pcap из STDIN в Python Scapy
есть ли способ прочитать .pcap из stdin в Python Scapy (используя rdpcap)? Каждый раз, когда я что-то пробую, я получаю ошибку (не могу прочитать файл). Использование выглядит следующим образом: python main.py < test_linux.pcap Я уже реализовал чтение файла с помощью параметров, но мне также…
0
Попробуйте этот код для py3k:
txt = open(filename, 'r')
print('Here\'s your file %r: ' % filename)
print(txt.read())
txt.close()
print('I\'ll also ask you to type it again: ')
file_again = input()
txt_again = open(file_again, 'r')
print(txt_again.read())
txt_again.close()
Поделиться nickanor 19 октября 2012 в 19:02
Похожие вопросы:
Чтение байтов из файла без указания кодировки в Python 3
В Python 2 Следующее с радостью загрузит первые два байта из двоичного файла: with open(file_name) as f: b = f.read(2) Однако в Python 3 то же самое может привести, например, к: UnicodeDecodeError:…
Python 3-копирование блока текста из файла ASCII
Я хочу скопировать блок текста из файла ASCII. Например, из строки: *ELEMENT, TYPE=S3, ELSET=DAM до самой линии: *ELEMENT, TYPE=S4, ELSET=WALL , а затем запишите его в новый файл ASCII. Не могли бы…
Чтение только конца огромного текстового файла
Возможный дубликат : Получить последние n строк файла с Python, аналогично хвосту Чтение файла в обратном порядке с помощью python У меня есть файл размером около 15 ГБ, это файл журнала, из…
Python; чтение файла и поиск нужного текста
Нужно создать функцию с двумя парами, именем файла для открытия и шаблоном. Шаблон будет строкой поиска. Например, функция откроет sentence.txt, который имеет что-то вроде The quick brown fox…
Чтение списка из файла в python
У меня есть файл, из которого в каждой строке содержится следующее: имя файла, длина списка, фактический список. Вот пример: a.txt 3 [4,2,9] b.txt 5 [1,6,5,2,8] c.txt 7 [1,2,3,4,5,6,7] и так далее….
Python чтение файла перемотка назад
Чтение файла с помощью Python. Формат файла выглядит следующим образом: [22/Oct/2013] GET KEYWORD apple/banana/tomato ID=23q539283492u39 ERROR:2 ERROR:3 parameters={} … Меня интересуют только все…
Чтение файла .pcap из STDIN в Python Scapy
есть ли способ прочитать .pcap из stdin в Python Scapy (используя rdpcap)? Каждый раз, когда я что-то пробую, я получаю ошибку (не могу прочитать файл). Использование выглядит следующим образом:…
Чтение двоичного файла и текста из одного файла в Python
Как читать двоичный файл и текст из одного и того же файла в Python? Я знаю, как делать каждый из них отдельно, и могу себе представить, что делаю оба очень тщательно, но не оба непосредственно со…
Создание объекта Python из строки в Python 3
Это не дубликат создания объекта функции из строки , потому что это решение Python 2 с exec , а не как function() Попытка реализовать это решение в Python 3 приводит к следующему: d = {} exec(def…
Извлечение текста из файла .PST
Я пытаюсь извлечь содержимое (как string/text) файла .pst . Я пробовал разные ответы, но не нашел никакого подходящего решения. Outlook PST-анализ файла в Python Чтение файлов PST из win32 или pypff…
Запись в файл Python. Перезапись файла Python
Высокоуровневый язык Python 3 имеет множество полезных средств, позволяющих взаимодействовать с текстовыми файлами. Вы можете как создавать документы для хранения информации, так и выполнять чтение, запись и удаление данных. Сегодня поговорим о создании и записи файлов.
Создание файла, его открытие и закрытие
Работа с текстовым файлом в Python начинается с момента вызова функции open. Она принимает в качестве атрибутов путь к объекту на ПК и режим обработки. Вы можете указать абсолютный путь (это адрес размещения на жёстком диске) или относительный (речь идёт о координатах относительно папки проекта).
Что касается режима обработки файла, то при его выборе учитывайте его назначение («r» — для чтения, «w» — для записи). Таблица ниже позволит вам ознакомиться с режимами доступа к файлу в Python:
А вот пример простейшего взаимодействия с текстовым документом:
file = open("otus.txt", "w") file.write("hello world") file.close()
Здесь функция open принимает относительный путь, открывая его для записи. При этом, если в папке файл otus.txt будет отсутствовать, метод open создает его автоматически, после чего откроет для него нужный режим обработки.
Метод close закрывает файл, а это необходимо сделать, выполнив нужные вам действия с переменной file (иначе потеряете информацию). Впрочем, можно обойтись и без close, используя связку операторов with as (переменная, которая ссылается на файл, должна быть прописана после конструкции):
with open("otus.txt", "w") as file: file.write("hello world")
Метод write() для записи в файл в Python
В предыдущих примерах мы уже использовали метод write(). Он позволяет записывать любую строку в открытый файл. Помните, что строки в Python способны содержать не только текст, но и двоичные данные.
Запись в файл построчно выполняется посредством записи нужной вам строки с последующей записью \n— символа перевода строки.
Давайте ещё раз посмотрим на запись в файл с помощью метода write(). Синтаксис:
Пример использования:
my_file = open("otus.txt", "w") my_file.write("Люблю Python!\nЭто крутой язык!") my_file.close()
Код, представленный выше, создаст файл otus.txt , записав в него указанную строку.
Давайте теперь выполним запись списка поэлементно, где каждый элемент списка будет записан в новой строке:
lines = ["one", "two", "three"] with open(r"C:\otus.txt", "w") as file: for line in lines: file.write(line + '\n')
Этот код позволит создать небольшой массив lines, содержащий три строковых элемента: «one», «two» и «three». Благодаря функции open и связке операторов with as произойдёт открытие текстового файла otus.txt в корневом каталоге жёсткого диска C. Далее произойдёт запись всех элементов списка с помощью write. Символ \n обеспечит, чтобы каждая запись была выполнена с новой строки.
Python | Текстовые файлы
Текстовые файлы
Последнее обновление: 21.06.2017
Запись в текстовый файл
Чтобы открыть текстовый файл на запись, необходимо применить режим w (перезапись) или a (дозапись). Затем для записи применяется метод write(str), в который передается записываемая строка. Стоит отметить, что записывается именно строка, поэтому, если нужно записать числа, данные других типов, то их предварительно нужно конвертировать в строку.
Запишем некоторую информацию в файл «hello.txt»:
with open("hello.txt", "w") as file: file.write("hello world")
Если мы откроем папку, в которой находится текущий скрипт Python, то увидем там файл hello.txt. Этот файл можно открыть в любом текстовом редакторе и при желании изменить.
Теперь дозапишем в этот файл еще одну строку:
with open("hello.txt", "a") as file: file.write("\ngood bye, world")
Дозапись выглядит как добавление строку к последнему символу в файле, поэтому, если необходимо сделать запись с новой строки, то можно использовать эскейп-последовательность «\n». В итоге файл hello.txt будет иметь следующее содержимое:
hello world good bye, world
Еще один способ записи в файл представляет стандартный метод print(), который применяется для вывода данных на консоль:
with open("hello.txt", "a") as hello_file: print("Hello, world", file=hello_file)
Для вывода данных в файл в метод print в качестве второго параметра передается название файла через параметр file. А первый параметр представляет записываемую в файл строку.
Чтение файла
Для чтения файла он открывается с режимом r (Read), и затем мы можем считать его содержимое различными методами:
readline(): считывает одну строку из файла
read(): считывает все содержимое файла в одну строку
readlines(): считывает все строки файла в список
Например, считаем выше записанный файл построчно:
with open("hello.txt", "r") as file: for line in file: print(line, end="")
Несмотря на то, что мы явно не применяем метод readline()
для чтения каждой строки, но в при переборе файла этот метод автоматически вызывается
для получения каждой новой строки. Поэтому в цикле вручную нет смысла вызывать метод readline. И поскольку строки разделяются символом перевода строки «\n», то чтобы исключить излишнего переноса на другую строку в функцию
print передается значение end=""
.
Теперь явным образом вызовем метод readline()
для чтения отдельных строк:
with open("hello.txt", "r") as file: str1 = file.readline() print(str1, end="") str2 = file.readline() print(str2)
Консольный вывод:
hello world good bye, world
Метод readline можно использовать для построчного считывания файла в цикле while:
with open("hello.txt", "r") as file: line = file.readline() while line: print(line, end="") line = file.readline()
Если файл небольшой, то его можно разом считать с помощью метода read():
with open("hello.txt", "r") as file: content = file.read() print(content)
И также применим метод readlines() для считывания всего файла в список строк:
with open("hello.txt", "r") as file: contents = file.readlines() str1 = contents[0] str2 = contents[1] print(str1, end="") print(str2)
При чтении файла мы можем столкнуться с тем, что его кодировка не совпадает с ASCII. В этом случае мы явным образом можем указать кодировку с помощью параметра encoding:
filename = "hello.txt" with open(filename, encoding="utf8") as file: text = file.read()
Теперь напишем небольшой скрипт, в котором будет записывать введенный пользователем массив строк и считывать его обратно из файла на консоль:
# имя файла FILENAME = "messages.txt" # определяем пустой список messages = list() for i in range(4): message = input("Введите строку " + str(i+1) + ": ") messages.append(message + "\n") # запись списка в файл with open(FILENAME, "a") as file: for message in messages: file.write(message) # считываем сообщения из файла print("Считанные сообщения") with open(FILENAME, "r") as file: for message in file: print(message, end="")
Пример работы программы:
Введите строку 1: hello Введите строку 2: world peace Введите строку 3: great job Введите строку 4: Python Считанные сообщения hello world peace great job Python
Чтение файлов — Документация Python для сетевых инженеров 3.0
В Python есть несколько методов чтения файла:
read
— считывает содержимое файла в строкуreadline
— считывает файл построчноreadlines
— считывает строки файла и создает список из строк
Посмотрим как считывать содержимое файлов, на примере файла r1.txt:
! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
read
Метод read
— считывает весь файл в одну строку.
Пример использования метода read
:
In [1]: f = open('r1.txt') In [2]: f.read() Out[2]: '!\nservice timestamps debug datetime msec localtime show-timezone year\nservice timestamps log datetime msec localtime show-timezone year\nservice password-encryption\nservice sequence-numbers\n!\nno ip domain lookup\n!\nip ssh version 2\n!\n' In [3]: f.read() Out[3]: ''
При повторном чтении файла в 3 строке, отображается пустая строка. Так
происходит из-за того, что при вызове метода read
, считывается
весь файл. И после того, как файл был считан, курсор остается в конце
файла. Управлять положением курсора можно с помощью метода seek
.
readline
Построчно файл можно считать с помощью метода readline
:
In [4]: f = open('r1.txt') In [5]: f.readline() Out[5]: '!\n' In [6]: f.readline() Out[6]: 'service timestamps debug datetime msec localtime show-timezone year\n'
Но чаще всего проще пройтись по объекту file в цикле, не используя
методы read...
:
In [7]: f = open('r1.txt') In [8]: for line in f: ...: print(line) ...: ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
readlines
Еще один полезный метод — readlines
. Он считывает строки файла в
список:
In [9]: f = open('r1.txt') In [10]: f.readlines() Out[10]: ['!\n', 'service timestamps debug datetime msec localtime show-timezone year\n', 'service timestamps log datetime msec localtime show-timezone year\n', 'service password-encryption\n', 'service sequence-numbers\n', '!\n', 'no ip domain lookup\n', '!\n', 'ip ssh version 2\n', '!\n']
Если нужно получить строки файла, но без перевода строки в конце, можно
воспользоваться методом split
и как разделитель, указать символ \n
:
In [11]: f = open('r1.txt') In [12]: f.read().split('\n') Out[12]: ['!', 'service timestamps debug datetime msec localtime show-timezone year', 'service timestamps log datetime msec localtime show-timezone year', 'service password-encryption', 'service sequence-numbers', '!', 'no ip domain lookup', '!', 'ip ssh version 2', '!', '']
Обратите внимание, что последний элемент списка — пустая строка.
Если перед выполнением split
, воспользоваться методом rstrip
, список будет без пустой строки в конце:
In [13]: f = open('r1.txt') In [14]: f.read().rstrip().split('\n') Out[14]: ['!', 'service timestamps debug datetime msec localtime show-timezone year', 'service timestamps log datetime msec localtime show-timezone year', 'service password-encryption', 'service sequence-numbers', '!', 'no ip domain lookup', '!', 'ip ssh version 2', '!']
seek
До сих пор, файл каждый раз приходилось открывать заново, чтобы снова его считать. Так происходит из-за того, что после методов чтения, курсор находится в конце файла. И повторное чтение возвращает пустую строку.
Чтобы ещё раз считать информацию из файла, нужно воспользоваться методом seek
, который перемещает курсор в необходимое положение.
Пример открытия файла и считывания содержимого:
In [15]: f = open('r1.txt') In [16]: print(f.read()) ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
Если вызывать ещё раз метод read
, возвращается пустая строка:
Но с помощью метода seek
можно перейти в начало файла (0 означает
начало файла):
После того как с помощью seek
курсор был переведен в начало
файла, можно опять считывать содержимое:
In [19]: print(f.read()) ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
Как читать и записывать файлы в Python 3
Введение
Python — отличный инструмент для обработки данных. Вполне вероятно, что любая программа, которую вы пишете, будет включать чтение, запись или манипулирование данными. По этой причине особенно полезно знать, как работать с разными форматами файлов, в которых хранятся разные типы данных.
Например, рассмотрим программу Python, которая проверяет список пользователей на предмет контроля доступа. Ваш список пользователей, скорее всего, будет сохранен в текстовом файле.Возможно, вы не работаете с текстом, а вместо этого имеете программу, которая выполняет финансовый анализ. Чтобы выполнить некоторую обработку чисел, вам, вероятно, придется ввести эти числа из сохраненной электронной таблицы. Независимо от вашего приложения, почти гарантировано, что будет задействован ввод или вывод данных.
В этом руководстве кратко описаны некоторые типы форматов, которые может обрабатывать Python. После краткого введения в форматы файлов мы рассмотрим, как открывать, читать и записывать текстовый файл в Python 3.
Когда вы закончите изучение этого руководства, вы сможете работать с любым текстовым файлом в Python.
Предварительные требования
Для этого руководства у вас должен быть установлен Python 3, а также настроена локальная среда программирования на вашем компьютере. Если это не так, вы можете выполнить настройку, следуя соответствующему руководству по установке и настройке для вашей операционной системы:
Фон
Python очень удобен и может с относительной легкостью обрабатывать ряд различных форматов файлов, включая, помимо прочего, следующие:
Тип файла | Описание |
---|---|
текст | В текстовом файле хранятся данные, представляющие только символы (или строки), и исключаются любые структурированные метаданные. |
CSV | В файле значений, разделенных запятыми, используются запятые (или другие разделители) для структурирования хранимых данных, что позволяет сохранять данные в табличном формате. |
HTML | Файл языка разметки гипертекста хранит структурированные данные и обычно используется на большинстве веб-сайтов. |
JSON | JavaScript Object Notation — простой и эффективный формат, что делает его одним из наиболее часто используемых форматов для хранения и передачи данных. |
В этом руководстве основное внимание уделяется файловому формату txt .
Шаг 1. Создание текстового файла
Прежде чем мы сможем начать работать с Python, нам нужно убедиться, что у нас есть файл, с которым можно работать. Для этого мы откроем текстовый редактор и создадим новый текстовый файл, назовем его days.txt
.
В новом файле введите несколько строк текста. В этом примере давайте перечислим дни недели:
.days.txt
Понедельник
вторник
среда
четверг
Пятница
Суббота
Воскресенье
Затем сохраните файл и убедитесь, что знаете, куда вы его поместили.В нашем примере наш пользователь sammy сохранил файл здесь: /users/sammy/days.txt
. Это будет очень важно на следующих этапах, когда мы откроем файл в Python.
Теперь, когда у нас есть текстовый файл для обработки, мы можем начать наш код!
Шаг 2 — Открытие файла
Прежде чем мы сможем написать нашу программу, мы должны создать программный файл Python, поэтому создайте файл files.py
в текстовом редакторе. Чтобы упростить задачу, сохраните его в том же каталоге, что и наши дни .txt
файл: / users / sammy /
.
Чтобы открыть файл в Python, нам сначала нужно каким-то образом связать файл на диске с переменной в Python. Этот процесс называется , открывая файл. Мы начинаем с того, что сообщаем Python, где находится файл. Расположение вашего файла часто обозначается как путь к файлу . Чтобы Python мог открыть ваш файл, ему требуется путь. Путь к нашему файлу days.txt
: /users/sammy/days.txt
. В Python мы создадим строковую переменную для хранения этой информации.В нашем сценарии files.py
мы создадим переменную path
и установим для нее путь days.txt.
files.py
путь = '/users/sammy/days.txt'
Затем мы воспользуемся функцией Python open ()
, чтобы открыть наш файл days.txt
. Функция open ()
требует в качестве первого аргумента путь к файлу. Функция также позволяет использовать многие другие параметры. Однако наиболее важным является необязательный параметр mode .Mode — это необязательная строка, определяющая режим, в котором открывается файл. Выбранный вами режим будет зависеть от того, что вы хотите делать с файлом. Вот некоторые из наших вариантов режима:
-
'r'
: использовать для чтения -
'w'
: использовать для записи -
'x'
: используйте для создания и записи в новый файл -
'a'
: использовать для добавления в файл -
'r +'
: использовать для чтения и записи в один и тот же файл
В этом примере мы хотим только читать из файла, поэтому мы будем использовать режим 'r'
.Мы воспользуемся функцией open ()
, чтобы открыть файл days.txt
и присвоить его переменной days_file
.
files.py
days_file = open (путь, 'r')
После того, как мы открыли файл, мы можем читать из него, что мы и сделаем на следующем шаге.
Шаг 3 — Чтение файла
Поскольку наш файл был открыт, теперь мы можем управлять им (т.е. читать из него) через переменную, которую мы ему присвоили. Python предоставляет три связанных операции для чтения информации из файла.Мы покажем, как использовать все три операции в качестве примеров, которые вы можете попробовать, чтобы понять, как они работают.
Первая операция
возвращает все содержимое файла в виде одной строки.
days_file.read ()
Выход
'Понедельник \ n Вторник \ n Среда \ n Четверг \ n Пятница \ n Суббота \ nВоскресенье \ n'
Вторая операция <файл> .readline ()
возвращает следующую строку файла, возвращая текст до следующего символа новой строки включительно.Проще говоря, эта операция будет читать файл построчно.
days_file.readline ()
Выход
'Понедельник \ n'
Следовательно, как только вы прочитаете строку с операцией чтения, она перейдет к следующей строке. Поэтому, если бы вы снова вызывали эту операцию, она вернула бы следующую строку в файле, как показано.
days_file.readline ()
Выход
'Вторник \ n'
Последняя операция, <файл>.readlines ()
возвращает список строк в файле, где каждый элемент списка представляет одну строку.
days_file.readlines ()
Вывод
['понедельник \ n', 'вторник \ n', 'среда \ n', 'четверг \ n', 'пятница \ n', 'суббота \ n', 'воскресенье \ n']
Следует иметь в виду, когда вы читаете из файлов, поскольку после того, как файл был прочитан с помощью одной из операций чтения, он не может быть прочитан снова. Например, если вы сначала запустите days_file.read ()
, за которым следует days_file.readlines ()
, вторая операция вернет пустую строку. Следовательно, в любое время, когда вы захотите прочитать из файла, вам придется сначала открыть новую файловую переменную. Теперь, когда мы прочитали из файла, давайте узнаем, как записать в новый файл.
Шаг 4 — Запись файла
На этом этапе мы собираемся написать новый файл, который будет включать заголовок «Дни недели», за которым следуют дни недели. Во-первых, давайте создадим нашу переменную title
.
files.py
title = 'Дни недели \ n'
Нам также нужно сохранить дни недели в строковой переменной, которую мы назовем days
. Чтобы упростить отслеживание, мы включаем код из описанных выше шагов. Мы открываем файл в режиме чтения, читаем файл и сохраняем возвращенный результат операции чтения в нашей новой переменной дней
.
files.py
путь = '/users/sammy/days.txt'
days_file = open (путь, 'r')
days = days_file.читать()
Теперь, когда у нас есть переменные для заголовка и дней недели, мы можем начать запись в наш новый файл. Во-первых, нам нужно указать расположение файла. Опять же, мы будем использовать каталог / users / sammy /
. Нам нужно будет указать новый файл, который мы хотим создать. Итак, наш путь на самом деле будет /users/sammy/new_days.txt
. Мы предоставляем информацию о нашем местоположении в переменной new_path
. Затем мы открываем наш новый файл в режиме записи, используя функцию open ()
с указанным режимом 'w'
.
files.py
new_path = '/users/sammy/new_days.txt'
new_days = open (новый_путь, 'w')
Важно отметить, что если new_days.txt уже существовал до открытия файла, его старое содержимое было бы уничтожено, поэтому будьте осторожны при использовании режима 'w'
.
Как только наш новый файл открыт, мы можем поместить данные в файл, используя операцию записи, <файл> .write ()
. Операция записи принимает единственный параметр, который должен быть строкой, и записывает эту строку в файл.Если вы хотите начать новую строку в файле, вы должны явно указать символ новой строки. Сначала мы записываем заголовок файла, а затем дни недели. Давайте также добавим некоторые печатные заявления о том, что мы пишем, что часто является хорошей практикой для отслеживания прогресса ваших скриптов.
files.py
new_days.write (заголовок)
печать (заголовок)
new_days.write (дни)
печать (дни)
Наконец, когда мы заканчиваем работу с файлом, мы должны обязательно закрыть его.Мы покажем это на нашем последнем этапе.
Шаг 5 — Закрытие файла
Закрытие файла гарантирует, что соединение между файлом на диске и файловой переменной завершено. Закрытие файлов также гарантирует, что другие программы смогут получить к ним доступ, и сохранит ваши данные в безопасности. Поэтому всегда закрывайте свои файлы. Теперь закроем все наши файлы с помощью функции
.
files.py
days_file.close ()
new_days.close ()
Мы закончили обработку файлов в Python и можем перейти к просмотру нашего кода.
Шаг 6 — Проверка нашего кода
Прежде чем мы запустим наш код, давайте убедимся, что все в порядке. Конечный продукт должен выглядеть примерно так:
files.py
путь = '/users/sammy/days.txt'
days_file = open (путь, 'r')
days = days_file.read ()
new_path = '/users/sammy/new_days.txt'
new_days = open (новый_путь, 'w')
title = 'Дни недели \ n'
new_days.write (заголовок)
печать (заголовок)
new_days.write (дни)
печать (дни)
days_file.close ()
new_days.close ()
После сохранения кода откройте терминал и запустите сценарий Python, например:
Наш результат должен выглядеть так:
Вывод
дней недели
понедельник
вторник
среда
четверг
Пятница
Суббота
Воскресенье
Теперь давайте дважды проверим, что наш код полностью работает, открыв новый файл ( new_days.txt
). Если все прошло хорошо, когда мы откроем наш новый файл, он должен выглядеть так:
new_days.txt
Дни недели
понедельник
вторник
среда
четверг
Пятница
Суббота
Воскресенье
Ваш файл будет выглядеть так же или похожим образом — вы успешно прошли это обучение!
Заключение
В этом руководстве мы рассмотрели, как обрабатывать простые текстовые файлы и манипулировать ими в Python 3. Теперь вы можете открывать, читать, записывать и закрывать файлы в Python, а также продолжать работать со своими собственными данными в Python.
Чтение и запись файлов на Python (Руководство) — Real Python
Смотреть сейчас В этом руководстве есть связанный видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Чтение и запись файлов на Python
Одна из наиболее распространенных задач, которые вы можете выполнять с помощью Python, — это чтение и запись файлов. Будь то запись в простой текстовый файл, чтение сложного журнала сервера или даже анализ необработанных байтовых данных, все эти ситуации требуют чтения или записи файла.
В этом руководстве вы узнаете:
- Из чего состоит файл и почему это важно в Python
- Основы чтения и записи файлов в Python
- Некоторые базовые сценарии чтения и записи файлов
Это руководство предназначено в основном для питонистов от начинающего до среднего уровня, но здесь есть несколько советов, которые могут быть оценены и более продвинутыми программистами.
Пройдите тест: Проверьте свои знания с помощью нашей интерактивной викторины «Чтение и запись файлов на Python».По завершении вы получите балл, чтобы вы могли отслеживать свой прогресс в обучении с течением времени:
Пройдите тест »
Что такое файл?
Прежде чем мы сможем перейти к тому, как работать с файлами в Python, важно понять, что именно представляет собой файл и как современные операционные системы обрабатывают некоторые из их аспектов.
По своей сути файл представляет собой непрерывный набор байтов, используемых для хранения данных. Эти данные организованы в определенном формате и могут быть как простыми, как текстовый файл, так и сложными, как исполняемый файл программы.В конце эти байтовые файлы затем преобразуются в двоичные коды 1
и 0
для упрощения обработки компьютером.
Файлы в большинстве современных файловых систем состоят из трех основных частей:
- Заголовок: метаданные о содержимом файла (имя файла, размер, тип и т. Д.)
- Данные: содержимое файла, написанное создателем или редактором
- Конец файла (EOF): специальный символ, обозначающий конец файла
То, что представляют эти данные, зависит от используемой спецификации формата, которая обычно представлена расширением.Например, файл с расширением .gif
, скорее всего, соответствует спецификации формата обмена графическими данными. Существуют сотни, если не тысячи, расширений файлов. В этом руководстве вы будете иметь дело только с расширениями файлов .txt
или .csv
.
Пути к файлам
При доступе к файлу в операционной системе требуется указать путь к файлу. Путь к файлу — это строка, представляющая расположение файла. Он разбит на три основные части:
- Путь к папке: расположение папки с файлами в файловой системе, где последующие папки разделены косой чертой
/
(Unix) или обратной косой чертой\
(Windows) - Имя файла: фактическое имя файла
- Расширение: конец пути к файлу с точкой (
.
) используется для обозначения типа файла
Вот небольшой пример. Допустим, у вас есть файл, расположенный в такой файловой структуре:
/
│
├── путь /
| │
│ ├── к /
│ │ └── cats.gif
│ │
│ └── dog_breeds.txt
|
└── animals.csv
Допустим, вы хотите получить доступ к файлу cats.gif
, и ваше текущее местоположение было в той же папке, что и путь
. Чтобы получить доступ к файлу, вам нужно пройти через папку path
, а затем папку с по
, наконец, дойдя до cats.gif
файл. Путь к папке — путь / к /
. Имя файла — кошек
. Расширение файла — .gif
. Таким образом, полный путь — это путь / to / cats.gif
.
Теперь предположим, что ваше текущее местоположение или текущий рабочий каталог (cwd) находится в папке с по
структуры папок нашего примера. Вместо того, чтобы ссылаться на cats.gif
по полному пути path / to / cats.gif
, на файл можно просто ссылаться по имени файла и расширению cats.Гифка
.
/
│
├── путь /
| │
| ├── to / ← Ваш текущий рабочий каталог (cwd) находится здесь
| │ └── cats.gif ← Доступ к этому файлу
| │
| └── dog_breeds.txt
|
└── animals.csv
А как насчет dog_breeds.txt
? Как бы вы могли получить к нему доступ, не используя полный путь? Вы можете использовать специальные символы с двумя точками ( ..
) для перемещения на один каталог вверх. Это означает, что ../dog_breeds.txt
будет ссылаться на dog_breeds.txt
из каталога с по
:
/
│
├── путь / ← Ссылка на эту родительскую папку
| │
| ├── в / ← Текущий рабочий каталог (cwd)
| │ └── cats.gif
| │
| └── dog_breeds.txt ← Доступ к этому файлу
|
└── animals.csv
Двойная точка ( ..
) может быть объединена в цепочку для перемещения по нескольким каталогам над текущим каталогом. Например, чтобы получить доступ к файлу animals.csv
из папки с по
, вы должны использовать ../../animals.csv
.
Окончание строк
Одна из проблем, часто возникающих при работе с данными файла, — это представление новой строки или окончания строки. Окончание строки уходит корнями в эпоху азбуки Морзе, когда определенный про-знак использовался для обозначения конца передачи или конца строки.
Позже это было стандартизовано для телетайпов Международной организацией по стандартизации (ISO) и Американской ассоциацией стандартов (ASA).Стандарт ASA гласит, что в конце строки должна использоваться последовательность символов возврата каретки ( CR
или \ r
) и символов перевода строки ( LF
или \ n
) ( CR + LF
или \ г \ п
). Однако стандарт ISO допускает использование символов CR + LF
или только LF
.
Windows использует символы CR + LF
для обозначения новой строки, в то время как Unix и более новые версии Mac используют только символ LF
.Это может вызвать некоторые сложности при обработке файлов в операционной системе, отличной от исходной. Вот небольшой пример. Допустим, мы исследуем файл dog_breeds.txt
, который был создан в системе Windows:
Мопс \ r \ n
Джек Рассел Терьер \ r \ n
Английский спрингер-спаниель \ r \ n
Немецкая овчарка \ r \ n
Стаффордширский бультерьер \ r \ n
Кавалер кинг чарльз спаниель \ r \ n
Золотистый ретривер \ r \ n
Вест-хайленд-уайт-терьер \ r \ n
Боксёр \ r \ n
Бордер терьер \ r \ n
Этот же вывод будет интерпретироваться на устройстве Unix по-разному:
Мопс \ г
\ п
Джек Рассел терьер \ r
\ п
Английский спрингер-спаниель \ r
\ п
Немецкая овчарка \ r
\ п
Стаффордширский бультерьер \ r
\ п
Кавалер кинг чарльз спаниель \ r
\ п
Золотистый ретривер \ r
\ п
Вест-хайленд-уайт-терьер \ r
\ п
Боксёр \ r
\ п
Бордер терьер \ r
\ п
Это может сделать перебор каждой строки проблематичным, и вам, возможно, придется учитывать подобные ситуации.
Кодировки символов
Другая распространенная проблема, с которой вы можете столкнуться, — это кодирование байтовых данных. Кодировка — это перевод байтовых данных в символы, читаемые человеком. Обычно это делается путем присвоения числового значения для представления символа. Двумя наиболее распространенными кодировками являются форматы ASCII и UNICODE. ASCII может хранить только 128 символов, в то время как Unicode может содержать до 1114112 символов.
ASCII на самом деле является подмножеством Unicode (UTF-8), что означает, что ASCII и Unicode имеют одинаковые числовые и символьные значения.Важно отметить, что синтаксический анализ файла с неправильной кодировкой символов может привести к сбоям или искажению символа. Например, если файл был создан с использованием кодировки UTF-8, и вы пытаетесь проанализировать его с использованием кодировки ASCII, если есть символ, выходящий за пределы этих 128 значений, будет выдана ошибка.
Открытие и закрытие файла в Python
Если вы хотите работать с файлом, первое, что нужно сделать, это открыть его. Это делается путем вызова встроенной функции open ()
. open ()
имеет единственный обязательный аргумент — путь к файлу. open ()
имеет единственный возврат, файловый объект:
файл = открытый ('dog_breeds.txt')
После открытия файла нужно научиться закрывать его.
Предупреждение: Вы должны всегда убедиться, что открытый файл правильно закрыт.
Важно помнить, что вы несете ответственность за закрытие файла. В большинстве случаев после завершения работы приложения или скрипта файл в конечном итоге закрывается.Однако нет никакой гарантии, когда именно это произойдет. Это может привести к нежелательному поведению, включая утечку ресурсов. Также рекомендуется использовать Python (Pythonic), чтобы убедиться, что ваш код ведет себя хорошо определенным образом и снижает любое нежелательное поведение.
Когда вы манипулируете файлом, вы можете использовать два способа, чтобы убедиться, что файл закрыт должным образом, даже при возникновении ошибки. Первый способ закрыть файл — использовать блок try-finally
:
reader = open ('dog_breeds.текст')
пытаться:
# Далее идет обработка файла
Ну наконец то:
reader.close ()
Если вы не знакомы с блоком try-finally
, ознакомьтесь с исключениями Python: введение.
Второй способ закрыть файл — использовать с оператором
:
с открытым ('dog_breeds.txt') в качестве читателя:
# Далее идет обработка файла
Оператор с
автоматически закрывает файл, как только он покидает с блоком
, даже в случае ошибки.Я настоятельно рекомендую вам как можно чаще использовать с оператором
, так как он позволяет сделать код более чистым и упрощает обработку любых неожиданных ошибок.
Скорее всего, вы также захотите использовать второй позиционный аргумент, режим
. Этот аргумент представляет собой строку, содержащую несколько символов, обозначающих способ открытия файла. По умолчанию и наиболее часто используется 'r'
, что означает открытие файла в режиме только для чтения в виде текстового файла:
с открытым ('dog_breeds.txt ',' r ') в качестве читателя:
# Далее идет обработка файла
Другие варианты режимов полностью задокументированы в Интернете, но наиболее часто используются следующие:
Персонаж | Значение |
---|---|
'r' | Открыто для чтения (по умолчанию) |
'ширина' | Открыть для записи, сначала обрезать (перезаписать) файл |
'rb' или 'wb' | Открыть в двоичном режиме (чтение / запись с использованием байтовых данных) |
Давайте вернемся и поговорим немного о файловых объектах.Файловый объект:
«объект, предоставляющий файловый API (с такими методами, как
read ()
илиwrite ()
) для базового ресурса». (Источник)
Есть три различных категории файловых объектов:
- Текстовые файлы
- Буферизованные двоичные файлы
- Необработанные двоичные файлы
Каждый из этих типов файлов определен в модуле io
. Вот краткое изложение того, как все выстраивается.
Типы текстовых файлов
Текстовый файл — это самый распространенный файл, с которым вы можете столкнуться. Вот несколько примеров того, как открываются эти файлы:
открыто ('abc.txt')
open ('abc.txt', 'r')
open ('abc.txt', 'ш')
С этими типами файлов open ()
вернет объект файла TextIOWrapper
:
>>> file = open ('dog_breeds.txt')
>>> тип (файл)
<класс '_io.TextIOWrapper'>
Это объект файла по умолчанию, возвращаемый функцией open ()
.
Типы буферизованных двоичных файлов
Буферизованный двоичный тип файла используется для чтения и записи двоичных файлов. Вот несколько примеров того, как открываются эти файлы:
открыто ('abc.txt', 'rb')
open ('abc.txt', 'wb')
С этими типами файлов open ()
вернет либо объект файла BufferedReader
, либо BufferedWriter
:
>>> file = open ('dog_breeds.txt', 'rb')
>>> тип (файл)
<класс '_io.BufferedReader '>
>>> file = open ('dog_breeds.txt', 'wb')
>>> тип (файл)
<класс '_io.BufferedWriter'>
Типы необработанных файлов
Необработанный тип файла:
«обычно используется в качестве низкоуровневого строительного блока для двоичных и текстовых потоков». (Источник)
Поэтому обычно не используется.
Вот пример того, как открываются эти файлы:
открыто ('abc.txt', 'rb', буферизация = 0)
С этими типами файлов open ()
вернет объект файла FileIO
:
>>> file = open ('dog_breeds.txt ',' rb ', буферизация = 0)
>>> тип (файл)
<класс '_io.FileIO'>
Чтение и запись открытых файлов
Открыв файл, вы захотите прочитать или записать в файл. Во-первых, давайте рассмотрим чтение файла. Есть несколько методов, которые могут быть вызваны для файлового объекта, чтобы помочь вам:
Метод | Что он делает |
---|---|
.read (size = -1) | Читает из файла на основе числа размером байт.Если аргумент не передан или Нет или -1 , то читается весь файл. |
. Строка чтения (размер = -1) | Считывает не более размера символов из строки. Это продолжается до конца строки, а затем возвращается обратно. Если аргумент не передан или Нет или -1 , то читается вся строка (или остальная часть строки). |
. Строки чтения () | Это считывает оставшиеся строки из файлового объекта и возвращает их в виде списка. |
Используя тот же файл dog_breeds.txt
, который вы использовали выше, давайте рассмотрим несколько примеров использования этих методов. Вот пример того, как открыть и прочитать весь файл с помощью .read ()
:
>>> с open ('dog_breeds.txt', 'r') в качестве читателя:
>>> # Прочитать и распечатать весь файл
>>> print (reader.read ())
Мопс
Джек Рассел терьер
Английский спрингер-спаниель
Немецкая овчарка
Стаффордширский бультерьер
Кавалер кинг чарльз спаниель
Золотистый ретривер
Вест-хайленд-уайт-терьер
Боксер
Бордер терьер
Вот пример того, как каждый раз читать 5 байтов строки с помощью Python .readline ()
метод:
>>> с open ('dog_breeds.txt', 'r') в качестве читателя:
>>> # Прочтите и распечатайте первые 5 символов строки 5 раз
>>> print (reader.readline (5))
>>> # Обратите внимание, что строка больше 5 символов и продолжается
>>> # вниз по строке, читая каждый раз по 5 символов до конца
>>> # строка, а затем "оборачивается" вокруг
>>> print (reader.readline (5))
>>> напечатайте (читатель.readline (5))
>>> print (reader.readline (5))
>>> print (reader.readline (5))
Мопс
разъем
Russe
ll Te
Rrier
Вот пример того, как прочитать весь файл в виде списка с помощью метода Python .readlines ()
:
>>> f = open ('dog_breeds.txt')
>>> f.readlines () # Возвращает объект списка
['Мопс \ n', 'Джек-рассел-терьер \ n', 'Английский спрингер-спаниель \ n', 'Немецкая овчарка \ n', 'Стаффордширский бультерьер \ n', 'Кавалер-кинг Чарльз-спаниель \ n', 'Золотистый ретривер \ n ',' Вест-хайленд-уайт-терьер \ n ',' Боксер \ n ',' Бордер-терьер \ n ']
Приведенный выше пример также можно выполнить, используя list ()
для создания списка из файлового объекта:
>>> f = open ('dog_breeds.текст')
>>> список (е)
['Мопс \ n', 'Джек-рассел-терьер \ n', 'Английский спрингер-спаниель \ n', 'Немецкая овчарка \ n', 'Стаффордширский бультерьер \ n', 'Кавалер-кинг Чарльз-спаниель \ n', 'Золотистый ретривер \ n ',' Вест-хайленд-уайт-терьер \ n ',' Боксер \ n ',' Бордер-терьер \ n ']
Итерация по каждой строке в файле
Обычно при чтении файла выполняется итерация по каждой строке. Вот пример того, как использовать метод Python .readline ()
для выполнения этой итерации:
>>> с открытым ('dog_breeds.txt ',' r ') в качестве читателя:
>>> # Прочитать и распечатать весь файл построчно
>>> line = reader.readline ()
>>> while line! = '': # Символ EOF - это пустая строка
>>> печать (строка, конец = '')
>>> line = reader.readline ()
Мопс
Джек Рассел терьер
Английский спрингер-спаниель
Немецкая овчарка
Стаффордширский бультерьер
Кавалер кинг чарльз спаниель
Золотистый ретривер
Вест-хайленд-уайт-терьер
Боксер
Бордер терьер
Другой способ перебора каждой строки в файле — использовать Python .readlines ()
файлового объекта. Помните, что .readlines ()
возвращает список, в котором каждый элемент в списке представляет строку в файле:
>>> с open ('dog_breeds.txt', 'r') в качестве читателя:
>>> для строки в reader.readlines ():
>>> печать (строка, конец = '')
Мопс
Джек Рассел терьер
Английский спрингер-спаниель
Немецкая овчарка
Стаффордширский бультерьер
Кавалер кинг чарльз спаниель
Золотистый ретривер
Вест-хайленд-уайт-терьер
Боксер
Бордер терьер
Однако приведенные выше примеры можно еще больше упростить, перебирая сам файловый объект:
>>> >>> с открытым ('dog_breeds.txt ',' r ') в качестве читателя:
>>> # Прочитать и распечатать весь файл построчно
>>> для строчки в ридере:
>>> печать (строка, конец = '')
Мопс
Джек Рассел терьер
Английский спрингер-спаниель
Немецкая овчарка
Стаффордширский бультерьер
Кавалер кинг чарльз спаниель
Золотистый ретривер
Вест-хайленд-уайт-терьер
Боксер
Бордер терьер
Этот последний подход является более питоническим и может быть более быстрым и более эффективным с точки зрения памяти. Поэтому рекомендуется использовать это вместо этого.
Примечание: Некоторые из приведенных выше примеров содержат print ('some text', end = '')
. end = ''
не позволяет Python добавлять дополнительную строку новой строки к печатаемому тексту и печатать только то, что читается из файла.
А теперь перейдем к написанию файлов. Как и при чтении файлов, файловые объекты имеют несколько методов, которые полезны для записи в файл:
Метод | Что он делает |
---|---|
.запись (строка) | Это записывает строку в файл. |
.writelines (seq) | Это записывает последовательность в файл. К каждому элементу последовательности не добавляются окончания строк. Вы можете добавить соответствующие окончания строки. |
Вот быстрый пример использования .write ()
и .writelines ()
:
с open ('dog_breeds.txt', 'r') в качестве читателя:
# Примечание: строки чтения не обрезают окончания строк
dog_breeds = читатель.readlines ()
с open ('dog_breeds_reversed.txt', 'w') в качестве писателя:
# В качестве альтернативы вы можете использовать
# writer.writelines (перевернутый (dog_breeds))
# Запишите породы собак в файл в обратном порядке
для породы реверс (dog_breeds):
писатель. писать (порода)
Работа с байтами
Иногда может потребоваться работа с файлами, использующими байтовые строки. Это делается путем добавления символа 'b'
к аргументу mode
. Применяются все те же методы для файлового объекта.Однако каждый из методов ожидает и вместо этого возвращает объект размером байт и
:
>>> с open ('dog_breeds.txt', 'rb') в качестве читателя:
>>> print (reader.readline ())
б'Мопс \ п '
Открытие текстового файла с флагом b
не так уж и интересно. Допустим, у нас есть эта симпатичная фотография джек-рассел-терьера ( jack_russell.png
):
. Вы действительно можете открыть этот файл в Python и изучить его содержимое! Начиная с модели .Формат файла png
четко определен, заголовок файла состоит из 8 байт, разбитых следующим образом:
Значение | Интерпретация |
---|---|
0x89 | «Магическое» число, указывающее, что это начало PNG |
0x50 0x4E 0x47 | PNG в ASCII |
0x0D 0x0A | Строка в стиле DOS, заканчивающаяся \ r \ n |
0x1A | Символ EOF в стиле DOS |
0x0A | Строка в стиле Unix, заканчивающаяся \ n |
Конечно, когда вы открываете файл и читаете эти байты по отдельности, вы можете видеть, что это действительно .png
заголовочный файл:
>>> с open ('jack_russell.png', 'rb') как byte_reader:
>>> печать (byte_reader.read (1))
>>> печать (byte_reader.read (3))
>>> печать (byte_reader.read (2))
>>> печать (byte_reader.read (1))
>>> печать (byte_reader.read (1))
б '\ x89'
b'PNG '
б '\ г \ п'
б '\ x1a'
б '\ п'
Полный пример:
dos2unix.py
Давайте принесем все это домой и рассмотрим полный пример того, как читать и писать в файл.Ниже приведен инструмент, подобный dos2unix
, который преобразует файл, содержащий окончания строк \ r \ n
, в \ n
.
Этот инструмент разбит на три основных раздела. Первый — это str2unix ()
, который преобразует строку из \ r \ n
окончания строки в \ n
. Второй — это dos2unix ()
, который преобразует строку, содержащую \ r \ n
символов, в \ n
. dos2unix ()
вызывает внутри себя str2unix ()
.Наконец, есть блок __main__
, который вызывается только тогда, когда файл выполняется как сценарий. Думайте об этом как об основной функции
, которую можно найти в других языках программирования.
"" "
Простой скрипт и библиотека для преобразования файлов или строк из dos, например
окончания строк в Unix, как окончания строк.
"" "
import argparse
импорт ОС
def str2unix (input_str: str) -> str:
р"""
Преобразует строку из концов строки \ r \ n в \ n
Параметры
----------
input_str
Строка, окончание строки которой будет преобразовано
Возврат
-------
Преобразованная строка
"" "
r_str = input_str.replace ('\ r \ n', '\ n')
вернуть r_str
def dos2unix (исходный_файл: стр., целевой_файл: стр.):
"" "
Преобразует файл, содержащий окончания строк типа Dos, в Unix, например
Параметры
----------
исходный файл
Путь к исходному файлу, который нужно преобразовать
dest_file
Путь к преобразованному файлу для вывода
"" "
# ПРИМЕЧАНИЕ: можно добавить проверку существования файла и перезапись файла
# защита
с open (source_file, 'r') в качестве читателя:
dos_content = reader.read ()
unix_content = str2unix (dos_content)
с open (dest_file, 'w') как писатель:
писатель.написать (unix_content)
если __name__ == "__main__":
# Создадим наш парсер аргументов и зададим его описание
parser = argparse.ArgumentParser (
description = "Скрипт, преобразующий файл, подобный DOS, в файл, подобный Unix",
)
# Добавьте аргументы:
# - source_file: исходный файл, который мы хотим преобразовать
# - dest_file: место назначения, куда должен идти вывод
# Примечание: использование типа аргумента argparse.FileType может
# оптимизировать некоторые вещи
parser.add_argument (
'исходный файл',
help = 'Местоположение источника'
)
парсер.add_argument (
'--dest_file',
help = 'Расположение файла назначения (по умолчанию: исходный_файл с добавлением _unix' ',
по умолчанию = Нет
)
# Разбираем аргументы (argparse автоматически берет значения из
# sys.argv)
args = parser.parse_args ()
s_file = args.source_file
d_file = args.dest_file
# Если целевой файл не был передан, предположим, что мы хотим
# создаем новый файл на основе старого
если d_file - None:
file_path, file_extension = os.path.splitext (s_file)
d_file = f '{file_path} _unix {file_extension}'
dos2unix (s_file, d_file)
Советы и хитрости
Теперь, когда вы освоили основы чтения и записи файлов, вот несколько советов и приемов, которые помогут вам развить свои навыки.
__файл__
Атрибут __file__
— это специальный атрибут модулей, аналогичный __name__
. Это:
«путь к файлу, из которого был загружен модуль, если он был загружен из файла.»(Источник
Примечание: Чтобы повторить итерацию, __file__
возвращает путь , относительный к тому месту, где был вызван исходный скрипт Python. Если вам нужен полный системный путь, вы можете использовать os.getcwd ()
, чтобы получить текущий рабочий каталог вашего исполняемого кода.
Вот пример из реальной жизни. На одной из моих прошлых работ я провел несколько тестов для аппаратного устройства. Каждый тест был написан с использованием скрипта Python с именем файла тестового скрипта, используемым в качестве заголовка.Затем эти сценарии будут выполнены и смогут распечатать свой статус с помощью специального атрибута __file__
. Вот пример структуры папок:
проект /
|
├── тесты /
| ├── test_commanding.py
| ├── test_power.py
| ├── test_wireHousing.py
| └── test_leds.py
|
└── main.py
Запуск main.py
дает следующее:
>>> python main.py
tests / test_commanding.py Начато:
tests / test_commanding.py Пройдено!
тесты / test_power.py Начато:
tests / test_power.py Пройдено!
tests / test_wireHousing.py Начато:
tests / test_wireHousing.py Ошибка!
tests / test_leds.py Начато:
tests / test_leds.py Пройдено!
Мне удалось запустить и получить статус всех моих тестов динамически с помощью специального атрибута __file__
.
Добавление к файлу
Иногда вам может понадобиться добавить в файл или начать запись в конце уже заполненного файла. Это легко сделать, используя символ 'a'
в качестве аргумента mode
:
с открытым ('dog_breeds.txt ',' a ') как a_writer:
a_writer.write ('\ nБигл')
Когда вы снова изучите dog_breeds.txt
, вы увидите, что начало файла не изменилось, и теперь в конец файла добавлен Beagle
:
>>> с open ('dog_breeds.txt', 'r') в качестве читателя:
>>> print (reader.read ())
Мопс
Джек Рассел терьер
Английский спрингер-спаниель
Немецкая овчарка
Стаффордширский бультерьер
Кавалер кинг чарльз спаниель
Золотистый ретривер
Вест-хайленд-уайт-терьер
Боксер
Бордер терьер
Бигль
Работа с двумя файлами одновременно
Бывают случаи, когда вы можете одновременно прочитать файл и записать в другой файл.Если вы воспользуетесь примером, который был показан, когда вы учились писать в файл, его фактически можно объединить в следующее:
d_path = 'dog_breeds.txt'
d_r_path = 'dog_breeds_reversed.txt'
с open (d_path, 'r') как читатель, open (d_r_path, 'w') как писатель:
dog_breeds = reader.readlines ()
писатель.writelines (перевернутый (dog_breeds))
Создание собственного контекстного менеджера
Может наступить время, когда вам понадобится более тонкий контроль над файловым объектом, поместив его в специальный класс.Когда вы это сделаете, использование с оператором
больше нельзя будет использовать, если вы не добавите несколько магических методов: __enter__
и __exit__
. Добавив их, вы создадите так называемый диспетчер контекста.
__enter __ ()
вызывается при вызове с оператором
. __exit __ ()
вызывается при выходе из с блоком операторов
.
Вот шаблон, который можно использовать для создания собственного класса:
класс my_file_reader ():
def __init __ (self, file_path):
себя.__path = путь к файлу
self .__ file_object = Нет
def __enter __ (сам):
self .__ file_object = open (собственный .__ путь)
вернуть себя
def __exit __ (self, type, val, tb):
self .__ file_object.close ()
# Дополнительные методы, реализованные ниже
Теперь, когда у вас есть собственный класс, который теперь является диспетчером контекста, вы можете использовать его аналогично встроенному open ()
:
с my_file_reader ('dog_breeds.txt') в качестве читателя:
# Выполнение пользовательских операций класса
проходить
Вот хороший пример.Помните милый образ Джека Рассела, который у нас был? Возможно, вы хотите открыть другие файлы .png и
, но не хотите каждый раз анализировать файл заголовка. Вот пример того, как это сделать. В этом примере также используются настраиваемые итераторы. Если вы не знакомы с ними, ознакомьтесь с Python Iterators:
класс PngReader ():
# Каждый файл .png содержит это в заголовке. Используйте это, чтобы проверить
# файл действительно имеет формат .png.
_expected_magic = b '\ x89PNG \ r \ n \ x1a \ n'
def __init __ (self, file_path):
# Убедитесь, что файл имеет правильное расширение
если не file_path.заканчивается с ('. png'):
поднять NameError ("Файл должен иметь расширение .png")
self .__ path = file_path
self .__ file_object = Нет
def __enter __ (сам):
self .__ file_object = open (self .__ путь, 'rb')
magic = self .__ file_object.read (8)
если магия! = self._expected_magic:
Raise TypeError ("Файл не является правильно отформатированным файлом .png!")
вернуть себя
def __exit __ (self, type, val, tb):
self .__ file_object.close ()
def __iter __ (сам):
# This и __next __ () используются для создания собственного итератора
# См. Https: // dbader.org / blog / python-итераторы
вернуть себя
def __next __ (сам):
# Прочитать файл в "Chunks"
# См. Https://en.wikipedia.org/wiki/Portable_Network_Graphics#%22Chunks%22_within_the_file
исходные_данные = сам .__ файл_объект.read (4)
# Файл не был открыт или не достиг EOF. Это означает, что мы
# дальше идти нельзя, поэтому остановите итерацию, подняв
# StopIteration.
если self .__ file_object равно None или initial_data == b '':
поднять StopIteration
еще:
# У каждого чанка есть len, тип, данные (на основе len) и crc
# Захватываем эти значения и возвращаем их как кортеж
chunk_len = int.from_bytes (начальные_данные, byteorder = 'большой')
chunk_type = self .__ file_object.read (4)
chunk_data = self .__ file_object.read (chunk_len)
chunk_crc = self .__ file_object.read (4)
вернуть chunk_len, chunk_type, chunk_data, chunk_crc
Теперь вы можете открывать файлов .png и
и правильно их анализировать с помощью вашего настраиваемого диспетчера контекста:
>>> с PngReader ('jack_russell.png') в качестве читателя:
>>> для l, t, d, c в читателе:
>>> print (f "{l: 05}, {t}, {c}")
00013, b'IHDR ', b'v \ x121k'
00001, b'sRGB ', b' \ xae \ xce \ x1c \ xe9 '
00009, b'pHYs ', b' (<] \ x19 '
00345, b'iTXt ', b "L \ xc2'Y"
16384, b'IDAT ', b'i \ x99 \ x0c ('
16384, b'IDAT ', b' \ xb3 \ xfa \ x9a $ '
16384, b'IDAT ', b' \ xff \ xbf \ xd1 \ n '
16384, b'IDAT ', b' \ xc3 \ x9c \ xb1} '
16384, b'IDAT ', b' \ xe3 \ x02 \ xba \ x91 '
16384, b'IDAT ', b' \ xa0 \ xa99 = '
16384, b'IDAT ', b' \ xf4 \ x8b.\ x92 '
16384, b'IDAT ', b' \ x17i \ xfc \ xde '
16384, b'IDAT ', b' \ x8fb \ x0e \ xe4 '
16384, b'IDAT ', b') 3 = {'
01040, b'IDAT ', b' \ xd6 \ xb8 \ xc1 \ x9f '
00000, b'IEND ', b' \ xaeB` \ x82 '
Не изобретайте змею заново
Есть типичные ситуации, с которыми вы можете столкнуться при работе с файлами. Большинство этих случаев можно обрабатывать с помощью других модулей. Вам могут понадобиться два распространенных типа файлов: .csv
и .json
. Real Python уже собрал несколько отличных статей о том, как с этим справиться:
Кроме того, существуют встроенные библиотеки, которые вы можете использовать, чтобы помочь вам:
-
wave
: чтение и запись файлов WAV (аудио) -
aifc
: чтение и запись файлов AIFF и AIFC (аудио) -
sunau
: чтение и запись файлов Sun AU -
tarfile
: чтение и запись файлов архива tar -
zipfile
: работа с ZIP-архивами -
configparser
: легко создавать и анализировать файлы конфигурации -
xml.etree.ElementTree
: создание или чтение файлов на основе XML -
msilib
: чтение и запись файлов установщика Microsoft -
plistlib
: создание и анализ файлов Mac OS X.plist
Есть еще много всего. Кроме того, в PyPI доступно еще больше сторонних инструментов. Вот некоторые популярные:
Ты - файловый мастер, Гарри!
Вы сделали это! Теперь вы знаете, как работать с файлами с помощью Python, включая некоторые продвинутые методы.Работа с файлами в Python теперь должна быть проще, чем когда-либо, и это приятное чувство, когда вы начинаете это делать.
Из этого руководства вы узнали:
- Что это за файл
- Как правильно открывать и закрывать файлы
- Как читать и писать файлы
- Некоторые передовые методы работы с файлами
- Некоторые библиотеки для работы с общими типами файлов
Если у вас есть вопросы, задавайте их в комментариях.
Пройдите тест: Проверьте свои знания с помощью нашей интерактивной викторины «Чтение и запись файлов на Python».По завершении вы получите балл, чтобы вы могли отслеживать свой прогресс в обучении с течением времени:
Пройдите тест »
Смотреть сейчас В этом руководстве есть связанный видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Чтение и запись файлов на Python
Чтение файла построчно в Python
Предварительные требования:
Python предоставляет встроенные функции для создания, записи и чтения файлов.Существует два типа файлов, которые могут обрабатываться в Python: обычные текстовые файлы и двоичные файлы (написанные на двоичном языке, нули и единицы). В этой статье мы изучим построчное чтение из файла.
Чтение построчно
Использование readlines ()
readlines () используется для чтения всех строк за один раз, а затем возвращает их как строковый элемент в каждой строке списка. Эту функцию можно использовать для небольших файлов, поскольку она считывает все содержимое файла в память, а затем разбивает его на отдельные строки.Мы можем перебирать список и удалять символ новой строки «\ n» с помощью функции strip ().
Пример:
Python3
|
Вывод:
Line1: Компьютерщики Line2: для Line3: Компьютерщики
Использование readline ()
Функция readline () считывает строку файла и возвращает ее в виде строки. Он принимает параметр n, который указывает максимальное количество байтов, которые будут прочитаны. Однако не читает более одной строки, даже если n превышает длину строки.Это будет эффективно при чтении большого файла, потому что вместо получения всех данных за один раз он выбирает строку за строкой. readline () возвращает следующую строку файла, которая в конце содержит символ новой строки. Кроме того, если достигнут конец файла, он вернет пустую строку.
Пример:
Python3
|
Вывод:
Line1 Гики Line2 для Line3 Компьютерщики
Использование цикла for
Итерируемый объект возвращается функцией open () при открытии файла.Этот последний способ построчного чтения файла включает итерацию файлового объекта в цикле for. При этом мы пользуемся преимуществами встроенной функции Python, которая позволяет нам выполнять итерацию по объекту файла неявно, используя цикл for в сочетании с использованием повторяемого объекта. Этот подход требует меньшего количества строк кода, что всегда является наилучшей практикой, которой следует придерживаться.
Пример:
Python3
|
Вывод:
Использование цикла for Строка 1: Гики Line2: для Строка 3: Компьютерщики
С оператором
В приведенных выше подходах каждый раз, когда файл открывается, его необходимо закрывать явно. Если забыть закрыть файл, это может привести к появлению нескольких ошибок в коде, т.е. многие изменения в файлах не вступят в силу, пока файл не будет должным образом закрыт.Чтобы предотвратить это, можно использовать оператор with. Оператор With в Python используется при обработке исключений, чтобы сделать код более понятным и читабельным. Это упрощает управление общими ресурсами, такими как файловые потоки. Обратите внимание на следующий пример кода, показывающий, как использование оператора with делает код более чистым. При использовании с оператором нет необходимости вызывать file.close (). Сам оператор with обеспечивает правильное получение и высвобождение ресурсов.
Пример:
Python3
|
Вывод:
Использование readlines () Строка 1: Гики Line2: для Line3: Компьютерщики Использование readline () Строка 1: Гики Line2: для Line3: Компьютерщики Использование цикла for Строка 1: Гики Line2: для Line3: Компьютерщики
Внимание компьютерщик! Укрепите свои основы с помощью курса Python Programming Foundation и изучите основы.
Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS .И чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень
Как создавать текстовые файлы, читать, писать, открывать, добавлять файлы в Python
В Python нет необходимости импортировать внешние библиотека для чтения и записи файлов. Python предоставляет встроенную функцию для создания, записи и чтения файлов.
В этом руководстве по обработке файлов в Python мы узнаем:
Как открыть текстовый файл в Python
Чтобы открыть файл, вам необходимо использовать встроенную функцию open
.Функция открытия файла Python возвращает объект файла, который содержит методы и атрибуты для выполнения различных операций по открытию файлов в Python.
Синтаксис функции открытого файла Python
file_object = open ("имя файла", "режим")
Здесь
- filename: дает имя файла, который открыл файловый объект.
- mode: атрибут файлового объекта сообщает вам, в каком режиме был открыт файл.
Более подробная информация об этих режимах объясняется ниже
Как создать текстовый файл в Python
с помощью записи в файл Python, вы можете создать файл.текстовые файлы (guru99.txt) с помощью кода, который мы продемонстрировали здесь:
Шаг 1) Откройте файл .txt
f = open ("guru99.txt", "w +")
- Мы объявили переменную f для открытия файла с именем guru99.txt. Open принимает 2 аргумента: файл, который мы хотим открыть, и строку, представляющую типы разрешений или операций, которые мы хотим выполнить с файлом.
- Здесь мы использовали букву «w» в нашем аргументе, которая указывает Python на запись в файл. и он создаст файл на Python, если он не существует в библиотеке
- Знак «плюс» указывает на чтение и запись для операции создания файла Python.
Шаг 2) Введите данные в файл
для i в диапазоне (10): f.write ("Это строка% d \ r \ n"% (i + 1))
- У нас есть цикл for, который работает с диапазоном из 10 чисел.
- Использование функции записи для ввода данных в файл.
- Результат, который мы хотим повторить в файле, - это «это номер строки», который мы объявляем с помощью функции записи файла Python, а затем процент d (отображает целое число)
- Итак, в основном мы вводим номер строки, которую мы пишем , затем вставьте его в возврат каретки и новый строчный символ
Шаг 3) Закройте экземпляр файла
f.close ()
- Это закроет экземпляр сохраненного файла guru99.txt
Вот результат после выполнения кода для создания текстового файла Пример Python:
Как создать текстовый файл в Python
Когда вы щелкнете в текстовом файле в нашем случае "guru99.txt" он будет выглядеть примерно так
Пример создания текстового файла в Python
Как добавить в файл в Python
Вы также можете добавить / добавить новый текст в уже существующий файл или новый файл.
Шаг 1)
f = open ("guru99.txt", "a +")
Еще раз, если вы можете увидеть знак плюса в коде, это означает, что он создаст новый файл, если это произойдет. не существует. Но в нашем случае у нас уже есть файл, поэтому нам не нужно создавать новый файл для Python, добавляемого к операции с файлом.
Шаг 2)
для i в диапазоне (2): f.write ("Добавленная строка% d \ r \ n"% (i + 1))
Это запишет данные в файл в режиме добавления.
Как добавить в файл в Python
Вы можете увидеть результат в файле «guru99.txt». Результатом кода является то, что более ранний файл добавляется с новыми данными Python к операции добавления к файлу.
Пример добавления к файлу в Python
Как читать файлы в Python
Вы можете прочитать файл в Python, вызвав файл .txt в «режиме чтения» (r).
Шаг 1) Открыть файл в режиме чтения
f = open ("guru99.txt "," r ")
Шаг 2) Мы используем функцию режима в коде, чтобы проверить, что файл находится в открытом режиме. Если да, продолжаем дальше
if f.mode == 'r':
Шаг 3) Используйте f.read для чтения данных файла и сохранения его в переменном содержимом для чтения файлов в Python
content = f.read ()
Шаг 4) Распечатать содержимое для текстового файла чтения Python
Вот результат чтения файла Пример Python:
Как читать файлы в Python
Как читать файл строка по строке в Python
Вы также можете прочитать свой.txt построчно, если ваши данные слишком велики для чтения. Код readlines () разделит ваши данные в удобном для чтения режиме.
Как читать файл построчно в Python
Когда вы запускаете код ( f1 = f.readlines ()) для построчного чтения файла в Python, он разделяет каждую строку и представляет файл в виде читаемый формат. В нашем случае строка короткая и читабельная, вывод будет похож на режим чтения. Но если есть сложный файл данных, который не читается, этот фрагмент кода может быть полезен.
Файловые режимы в Python
Ниже приведены различные файловые режимы в Python :
Режим | Описание |
---|---|
'r' | Это режим по умолчанию. Открывает файл для чтения. |
'w' | Этот режим Открывает файл для записи. Если файл не существует, создается новый файл. Если файл существует, он обрезает файл. |
'x' | Создает новый файл.Если файл уже существует, операция не выполняется. |
'a' | Открыть файл в режиме добавления. Если файл не существует, создается новый файл. |
't' | Это режим по умолчанию. Открывается в текстовом режиме. |
'b' | Открывается в двоичном режиме. |
'+' | Это откроет файл для чтения и записи (обновления) |
Вот полный код для Python print () в примере файла
Python 2 Пример
def main (): f = open ("guru99.txt "," w + ") # f = open ("guru99.txt", "a +") для i в диапазоне (10): f.write ("Это строка% d \ r \ n"% (i + 1)) f.close () # Откройте файл и прочтите его содержимое # f = open ("guru99.txt", "r") # если f.mode == 'r': # contents = f.read () # распечатать содержимое # или readlines считывает отдельную строку в список #fl = f.readlines () # для x in fl: #print x если __name __ == "__main__": main ()
Пример Python 3
Ниже приведен еще один пример Python print () в файл:
def main (): f = open ("guru99.txt "," w + ") # f = open ("guru99.txt", "a +") для i в диапазоне (10): f.write ("Это строка% d \ r \ n"% (i + 1)) f.close () # Откройте файл и прочтите его содержимое # f = open ("guru99.txt", "r") #if f.mode == 'r': # contents = f.read () # print (содержимое) # или readlines считывает отдельную строку в список #fl = f.readlines () # для x in fl: #print (x) если __name __ == "__main__": main ()
Сводка
- Python позволяет читать, записывать и удалять файлы
- Используйте функцию open ("filename", "w +") для создания текстового файла Python.Знак + сообщает интерпретатору Python для открытого текстового файла Python с разрешениями на чтение и запись.
- Чтобы добавить данные в существующий файл или выполнить операцию печати Python в файл, используйте команду open («Имя файла», « a »).
- Используйте функцию чтения Python из файла для чтения ВСЕГО содержимого файла.
- Используйте функцию readlines, чтобы читать содержимое файла по одному.
Python - чтение текстового файла
Чтение текстового файла в Python
Чтобы прочитать текстовый файл в Python, выполните следующие действия.
- Вызов встроенной функции open () с указанием пути к файлу и режима в качестве аргументов. Функция open () возвращает файловый объект.
- Вызвать метод read () для файлового объекта. read () возвращает строку.
- Возвращенная строка - это полный текст из текстового файла.
Пример 1: чтение текстового файла
В следующей программе Python мы откроем файл sample.txt в режиме чтения. Мы прочитаем все содержимое текстового файла и выведем текст на консоль.
Программа Python
fileObject = open ("sample.txt", "r")
data = fileObject.read ()
print (data)
Вывод
Добро пожаловать на pythonexamples.org
Вы можете указать полный или абсолютный путь к функции open () или указать относительный путь, если базовый путь присутствует в среде PATH Переменная.
Пример 2: только чтение некоторых символов в текстовом файле
Если вам нужно прочитать только определенное количество символов, скажем, количество символов N, присутствующих в начале файла, передайте N (число) в качестве аргумента для чтения ( ) функция.
В следующей программе Python мы прочитаем первые 20 символов файла.
Программа Python
f = open ("sample.txt", "r")
data = f.read (20)
print (data)
Вывод
Добро пожаловать в pythonexa
Функция read (20) вернула первые 20 символов из текстового файла.
Пример 3: чтение файла в текстовом режиме
Режимы чтения, записи и выполнения зависят от разрешений.В зависимости от характера контента существуют текстовые и двоичные файлы.
В следующем примере мы явно откроем файл в текстовом режиме, указав «t» вместе с режимом чтения «r» .
Программа Python
f = open ("sample.txt", "rt")
data = f.read ()
print (data)
Вывод
Добро пожаловать на pythonexamples.org
Пример 4. Чтение текстового файла построчно
Чтобы прочитать текст построчно из файла, используйте File.readline () функция. File.readline () возвращает текущую строку и обновляет свой указатель на следующую строку. Итак, когда вы вызываете функцию readline () в следующий раз, возвращается следующая строка.
Помните, что readline () возвращает строку вместе с символом новой строки в конце строки, за исключением последней строки. Итак, если вам не нужен символ новой строки, вы можете использовать функцию strip (). Здесь есть одна загвоздка. Если ваша строка содержит символы пробела в начале и в конце, и если вы используете strip (), вы потеряете эти символы пробела в строке.
В этом примере мы будем читать текстовый файл построчно.
Программа Python
#get file object
f = open ("sample.txt", "r")
в то время как (Истина):
# читать следующую строку
line = f.readline ()
# если строка пуста, вы закончили со всеми строками в файле
если не строка:
сломать
# вы можете получить доступ к строке
печать (line.strip ())
#close file
f.close
Выход
Привет, пользователь!
Добро пожаловать в примеры Python.
Продолжайте изучение.
Резюме
В этом руководстве по примерам Python мы узнали, как читать текстовый файл в Python с помощью хорошо подробных примеров программ Python.
python - Как прочитать файл построчно в список?
Чтобы прочитать файл в списке, вам нужно сделать три вещи:
- Открыть файл
- Прочитать файл
- Сохранить содержимое как список
К счастью, Python позволяет очень легко делать эти вещи, поэтому самый короткий способ прочитать файл в список:
lst = список (открыть (имя файла))
Однако я добавлю еще несколько пояснений.
Открытие файла
Я предполагаю, что вы хотите открыть определенный файл и не имеете дело непосредственно с дескриптором файла (или дескриптором, подобным файлу). Наиболее часто используемая функция для открытия файла в Python - это open
, она принимает один обязательный аргумент и два необязательных аргумента в Python 2.7:
- Имя файла
- Режим
- Буферизация (я проигнорирую этот аргумент в этом ответе)
Имя файла должно быть строкой, представляющей путь к файлу .Например:
open ('afile') # открывает файл с именем afile в текущем рабочем каталоге
open ('adir / afile') # относительный путь (относительно текущего рабочего каталога)
open ('C: / users / aname / afile') # абсолютный путь (окна)
open ('/ usr / local / afile') # абсолютный путь (linux)
Обратите внимание, что необходимо указать расширение файла. Это особенно важно для пользователей Windows, поскольку расширения файлов, такие как .txt
или .doc
, и т. Д.скрыты по умолчанию при просмотре в проводнике.
Второй аргумент - это режим
, по умолчанию это r
, что означает «только для чтения». Это именно то, что вам нужно в вашем случае.
Но если вы действительно хотите создать файл и / или записать в файл, вам понадобится другой аргумент. Если вам нужен обзор, есть отличный ответ.
Для чтения файла вы можете опустить режим
или передать его явно:
открыто (имя файла)
open (имя файла, 'r')
Оба откроют файл в режиме только для чтения.Если вы хотите читать двоичный файл в Windows, вам необходимо использовать режим rb
:
открыто (имя файла, 'rb')
На других платформах 'b'
(двоичный режим) просто игнорируется.
Теперь, когда я показал, как открыть файл
, давайте поговорим о том факте, что вам всегда нужно снова закрыть
. В противном случае он будет сохранять открытый дескриптор файла до тех пор, пока процесс не завершится (или Python не испортит дескриптор файла).
Пока можно было использовать:
f = open (имя файла)
# ... делать что-нибудь с f
f.close ()
При этом не удается закрыть файл, когда что-то между open
и close
вызывает исключение. Вы можете избежать этого, используя , попробуйте
и, наконец,
:
f = open (имя файла)
# ничего промежуточного!
пытаться:
# делать что-нибудь с f
Ну наконец то:
f.close ()
Однако Python предоставляет диспетчеры контекста с более красивым синтаксисом (но для open
он почти идентичен , попробуйте
и , наконец,
выше):
с открытым (имя файла) как f:
# делать что-нибудь с f
# Файл всегда закрывается после окончания области видимости.
Последний подход - это рекомендованный подход для открытия файла в Python!
Чтение файла
Хорошо, вы открыли файл, теперь как его читать?
Функция open
возвращает объект файла
и поддерживает итерационный протокол Pythons. Каждая итерация даст вам строку:
с открытым (имя файла) как f:
для строки в f:
печать (строка)
Будет напечатана каждая строка файла.Однако обратите внимание, что каждая строка будет содержать символ новой строки \ n
в конце (вы можете проверить, построен ли ваш Python с универсальной поддержкой новой строки - в противном случае у вас также может быть \ r \ n
в Windows или \ r
на Mac как символы новой строки). Если вы этого не хотите, вы можете просто удалить последний символ (или последние два символа в Windows):
с открытым (имя файла) как f:
для строки в f:
печать (строка [: - 1])
Но последняя строка не обязательно должна иметь завершающую новую строку, поэтому не следует ее использовать.Можно проверить, заканчивается ли он завершающим символом новой строки, и если да, то удалить его:
с открытым (имя файла) как f:
для строки в f:
если line.endswith ('\ n'):
строка = строка [: - 1]
печать (строка)
Но вы можете просто удалить все пробелы (включая символ \ n
) с конца строки , это также удалит все остальные конечных пробелов , поэтому вы должны быть осторожны, если они важны:
с открытым (имя файла) как f:
для строки в f:
печать (f.rstrip ())
Однако, если строки заканчиваются на \ r \ n
(«новые строки» Windows), то .rstrip ()
также позаботится о \ r
!
Сохранить содержимое как список
Теперь, когда вы знаете, как открыть файл и прочитать его, пора сохранить содержимое в списке. Самый простой вариант - использовать функцию list
:
с открытым (имя файла) как f:
lst = список (f)
В случае, если вы хотите удалить завершающие символы новой строки, вы можете вместо этого использовать понимание списка:
с открытым (имя файла) как f:
lst = [строка.rstrip () для строки в f]
Или даже проще: метод .readlines ()
объекта файла
по умолчанию возвращает список
строк:
с открытым (имя файла) как f:
lst = f.readlines ()
Это также будет включать в себя завершающие символы новой строки, если они вам не нужны, я бы рекомендовал подход [line.rstrip () для строки в f]
, потому что он позволяет избежать хранения двух списков, содержащих все строки в памяти.
Есть дополнительная опция для получения желаемого результата, но она скорее «неоптимальная»: читает
весь файл в строке, а затем разбивает его на новые строки:
с открытым (имя файла) как f:
lst = f.read (). split ('\ n')
или:
с открытым (имя файла) как f:
lst = f.read (). splitlines ()
Они автоматически обрабатывают завершающие символы новой строки, потому что разделенный символ
не включен.Однако они не идеальны, потому что вы храните файл как строку и как список строк в памяти!
Сводка
- Используйте
с open (...) как f
при открытии файлов, потому что вам не нужно заботиться о закрытии файла самостоятельно, и он закрывает файл, даже если происходит какое-то исключение. -
файл Объекты
поддерживают протокол итераций, поэтому построчное чтение файла так же просто, какдля строки в the_file_object:
. - Всегда просматривайте документацию на предмет доступных функций / классов.В большинстве случаев есть идеальное соответствие для задачи или, по крайней мере, одно или два хороших. В этом случае очевидным выбором будет
readlines ()
, но если вы хотите обработать строки перед сохранением их в списке, я бы порекомендовал простое понимание списка.
Python Read File: Пошаговое руководство
Функция open () открывает файл. Вы должны использовать режим «r» для чтения файла. Функции read (), readline (), readlines () возвращают содержимое открытого вами файла.
Python - полезный язык программирования для обработки данных. В языке есть несколько встроенных функций, которые упрощают чтение, запись и управление данными или файлами.
Допустим, у вас есть список имен сотрудников, и вы хотите проверить, есть ли имя пользователя в этом списке. Вы можете сохранить список имен сотрудников в виде файла. Затем вы можете использовать Python, чтобы прочитать этот файл и проверить, хранится ли имя сотрудника в этом файле.
В этом руководстве мы собираемся изучить основы чтения файлов в Python.Для начала мы обсудим, как открыть файл и получить к нему доступ. Затем мы перейдем к изучению того, как читать файл в Python.
Открыть файл для чтения в Python
Найдите свой учебный лагерь Match
- Карьера Карма подойдет вам с лучшими техническими учебными курсами
- Получите эксклюзивные стипендии и подготовительные курсы
Первым шагом к чтению файла в Python является открытие файла, который вы хотите прочитать.Вам нужно сообщить Python имя файла, который вы хотите открыть.
Чтобы прочитать файл, вы должны сначала сообщить Python, где находится этот файл. Вы можете сделать это, указав путь к файлу и объявив его в переменной.
Вот синтаксис для открытия файла в Python:
filename = "/users/career_karma/names.txt" names_file = open (имя_файла, 'r')
Наш код открывает файл по пути, который мы определили в переменной «filename».
Флаг r в конце функции open () сообщает Python, что мы хотим только прочитать наш файл.Мы могли бы изменить этот флаг, если бы захотели отредактировать наш файл.
Python читать файл
Теперь, когда наш файл открыт, мы можем прочитать его через Python. Есть три функции, которые мы можем использовать для чтения данных из файла, а именно:
- read () : возвращает содержимое файла
- readline () : возвращает следующую строку файла
- readlines () : возвращает список строк в файле
Давайте перерыв вниз, как каждый из них работает.Метод read () может возвращать все содержимое файла в виде строки.
Текстовый файл чтения Python
Вот пример read () , работающего с текстовым файлом, содержащим список имен:
путь = "/users/career_karma/names.txt" names_file = open (путь, 'r') print (names_file.read ())
Наша программа возвращает следующее:
"Салли \ nАлекс / nПамела / nJonas / nLuke / nWill / n"
Метод read () вернул все содержимое нашего файла names , включая символы новой строки в конце нашей строки.
Функция readline () возвращает следующую строку файла. readline () возвращает текст и символ новой строки в конце файла. Следующий код прочитает первую строку нашего файла:
печать (names_file.readline ())
Наш код возвращает:
Если бы мы хотели прочитать первую и вторую строки нашего существующего файла, нам нужно было бы снова использовать функцию readline () :
names_file = open (путь, 'r') print (names_file.readline ()) печать (имя_файла.readline ())
Наш код возвращает следующий результат:
Python построчное чтение файла
Функция readline () может быть полезна, если вы хотите читать файл построчно. Эта функция обычно используется в цикле для для чтения нескольких строк в файле, например:
для i в диапазоне (0, 2): печать (имя_файла.readline ())
Наш код возвращает следующее:
Наконец, метод readlines () возвращает список строк в файле.Эта функция возвращает массив, и каждый элемент представляет собой одну строку в файле:
печать (names_file.readlines ())
Программа возвращает следующее:
['Салли \ n', 'Алекс \ n', 'Памела \ n', 'Джонас \ n', 'Люк \ n', 'Уилл']
После того, как вы прочитали файл, вы не можете его перечитать. Итак, когда вы прочитали файл с помощью readlines () , попытка перечитать файл с помощью любой операции чтения файла вернет пустую строку. Если вы хотите прочитать файл несколько раз, вам нужно будет снова открыть файл и прочитать его.
Заключение
Вы можете использовать функции read (), , readline (), и readlines () для чтения определенных частей файла. Затем вы манипулируете данными в зависимости от ваших потребностей. Сегодня мы рассмотрели, как открыть файл, прочитать его с помощью определенных методов и как закрыть его в Python.
Теперь вы готовы открывать и читать файлы Python как эксперт! Чтобы узнать больше о Python, прочитайте наше руководство по программированию на Python.
.