Как прочитать файлы в Python и решить проблему с кодировками
На практике в реальных проектах Data Science часто приходится сталкиваться с чтением датасетов, а также записывать добытую в ходе вычислений информацию в файлы. Сегодня мы расскажем о работе с файлами в Python: чтение и запись, проблема с кодировками, добавление значений в конец файла, временные папки и файлы.
Открываем, а затем читаем или записываем
Предположим, у нас имеется файл, который нужно прочитать в Python. Для этого можно воспользоваться функцией open внутри контекстного менеджера:
with open('file.txt') as f: data = f.read() # содержимое файла
Таким же образом можно записать информацию в файл, указав w
в качестве аргумента:
text = 'Hello' with open('file.txt', 'w') as f: f.write(text)
Отметим некоторые особенности данной функции. Во-первых, для чтения файла мы не указывали никаких аргументов кроме имени файла, поскольку по умолчанию уже стоит режим чтения. Мы также не указывали явно, что это именно текстовый файл, а не бинарный, так как это тоже стоит по умолчанию. Для чтения и записи бинарных файлов добавляется b
, например, rb
или wb
.
Во-вторых, мы использовали функцию open в контекстном менеджере. Можно обойтись и без него, но тогда после чтения или записи следует закрыть файл.
f = open('file.txt') f.read() f.close()
На открытие файла Python выделяет память, поэтому, чтобы избежать ее утечки, рекомендуется закрывать файлы.
Чтение файла с разной кодировкой
На многих операционных системах Python в качестве стандарта кодирования использует UTF-8, который также поддерживает кириллицу. Тем не менее, часто можно столкнуться с проблемами неправильной кодировки и получить распространенную ошибку вроде этой:
>>> f = open('somefile.txt', encoding='ascii') >>> f. read() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/Python3.8/encodings/ascii.py", line 26, in decode return codecs.ascii_decode(input, self.errors)[0] UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 12: ordinal not in range(128))
В примере указана кодировка ASCII, но файл закодирован в другом формате, поэтому и возникает такая ошибка. Решить ее можно тремя способами:
- Указать
erorr=replace
, который заменит нераспознанные символы знаком?
:>>> f = open('somefile.txt', encoding='ascii', errors='replace') >>> f.read() 'H?llo py?ho?-school!'
- Указать
erorr=ignore
, который проигнорирует нераспознанные символы:>>> f = open('somefile.txt', encoding='ascii', errors='replace') >>> f. read() 'Hllo pyho-school!'
- Указать правильную кодировку. Если текст на русском языке, то можно посмотреть кодировки с поддержкой кириллицы, которые есть в документации Python. Например, явно указать UTF-8 или cp1251:
Добавление в конец и запрет открытия файлов
Как мы уже отметили ранее, для записи текстового файла добавляется аргумент w
. Но если вызвать метод write, он перепишет весь файл. Во многих случаях требуется добавить данные в конец файла. Тогда используется a
вместо w
:
text2 = 'world' with open('file.txt', 'a') as f: f.write(text) # Helloworld
Если файла не существует, то при a
и при w
он будет создан. Но чтобы не трогать существующие файлы, а создать новый, передается параметр x
:
# 'x' не даст возможности открыть файл, так как он существует >>> with open('file. txt', 'x') as f: ... f.write(text2) FileExistsError Traceback (most recent call last) FileExistsError: [Errno 17] File exists: 'file.txt' # Поскольку file2.txt не существует, все OK >>> with open('file2.txt', 'x') as f: ... f.write(text2)
Временные файлы
Иногда бывает, что требуется создать файл или папку внутри Python-программы, а после ее закрытия их нужно удалить. Тогда пригодится стандартный модуль tempfile. Например, класс TemporaryFile
создаст временный файл, который удалится после закрытия. Ниже пример в Python.
>>> from tempfile import TemporaryFile >>> f = TemporaryFile("w+t") >>> f.write("hello") >>> f.seek(0) >>> f.read() 'hello' >>> f.close() # файл уничтожается # либо в контекстном менеджере f.write(text2)
Обратите внимание на 3 вещи. Первое, мы явно передаем "w+t"
, чтобы записать как текстовый файл, поскольку по умолчанию стоит "w+b"
для бинарных файлов. Второе, метод seek(0)
используется для перехода на самый первый символ, поскольку чтение происходит с текущего указателя, а он стоит в конце (после буквы ‘o’ в слове ‘hello’). Поэтому не стоит переживать, что мы можем стереть предыдущую запись:
>>> f.seek(5) # переходим в конец >>> f.read() '' >>> f.write("world") 5 >>> f.seek(0) # переходим в начало >>> f.read() 'helloworld'
Третье, файл TemporaryFile
невидим для файловой системы, он используется только внутри Python, поэтому извне будет трудно его найти.
Именованные временные файлы
А вот объекты класса NamedTemporaryFile
будут видны файловой системе, и найти месторасположение можно с помощью атрибута name
:
>>> from tempfile import NamedTemporaryFile >>> f = NamedTemporaryFile("w+t") >>> f. name '/tmp/tmp60djsgli' >>> f.close()
Как можно заметить, файл называется tmp60djsgli
. Для удобства можно явно указать его название и формат:
>>> f = NamedTemporaryFile("w+t", prefix="myfile", suffix=".txt") >>> f.name '/tmp/myfile7mxae0fi.txt'
Временные папки
Кроме временных файлов можно создавать временные папки. Для этого используется класс
:
>>> from tempfile import TemporaryDirectory >>> d = TemporaryDirectory() >>> d.name '/tmp/tmp5eadqzz5'
Он также принимает в качестве аргументов prefix
и suffix
, а также может использоваться внутри контекстного менеджера Python.
В следующей статье поговорим о взаимодействии файловой системы и Python. А получить практические навыки работы с файлами на реальных проектах Data Science вы сможете на наших курсах по Python в лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.
Смотреть расписание
Записаться на курс
Источники
- https://docs.python.org/3/library/functions.html#open
- https://docs.python.org/3/library/tempfile.html
Открытие файла, чтение и запись информации средствами pathlib в Python.
Описанные ниже методы позволяют производить чтение и запись в файл средствами модуля pathlib
. Данные методы принадлежат экземпляру, созданному из класса Path()
.
Так же класс pathlib.Path()
поддерживает все операции по манипуляции с путями файловой системы.
Смотрите другие методы и свойства, доступные экземпляру класса Path()
модуля pathlib
.
- Открыть файл для чтения/записи
- Прочитать двоичный файл
- Прочитать текстовый файл
- Записать двоичные данные в файл
- Записать текстовые данные в файл
Path. open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
:Метод Path.open()
открывает файл, на который указывает путь path
, как это делает встроенная функция open()
:
>>> from pathlib import Path >>> p = Path('setup.py') >>> with p.open() as f: ... f.readline() ... # '#!/usr/bin/env python3\n'
Path.read_bytes()
:Метод Path.read_bytes()
вернет двоичное содержимое указанного файла в виде байтового объекта:
>>> from pathlib import Path >>> p = Path('my_binary_file') >>> p.write_bytes(b'Binary file contents') # 20 >>> p.read_bytes() # b'Binary file contents'
В результате работы метода, файл открывается, а затем закрывается.
Path.read_text(encoding=None, errors=None)
:Метод Path.
вернет декодированное содержимое указанного файла в виде строки:
>>> from pathlib import Path >>> p = Path('my_text_file') >>> p.write_text('Text file contents') # 18 >>> p.read_text() # 'Text file contents'
В результате работы метода, файл открывается, а затем закрывается. Необязательные параметры имеют то же значение, что и встроенная функция open()
.
Path.write_bytes(data)
:Метод Path.write_bytes()
открывает файл в байтовом режиме для записи, записывает в него данные data
и закрывает его:
>>> from pathlib import Path >>> p = Path('my_binary_file') >>> p.write_bytes(b'Binary file contents') # 20 >>> p.read_bytes() # b'Binary file contents'
Существующий файл с тем же именем перезаписывается.
Необязательные параметры имеют то же значение, что и встроенная функцияopen()
.Path.write_text(data, encoding=None, errors=None, newline=None)
:Метод Path.write_text()
открывает файл для записи в текстовом режиме, записывает в него данные data
и закрывает его:
>>> from pathlib import Path >>> p = Path('my_text_file') >>> p.write_text('Text file contents') # 18 >>> p.read_text() # 'Text file contents'
Существующий файл с тем же именем перезаписывается. Необязательные параметры имеют то же значение, что и встроенная функция open()
.
Изменено в Python 3.10: добавлен параметр новой строки newline
.
Запись файла Python
❮ Назад Далее ❯
Запись в существующий файл
Для записи в существующий файл необходимо добавить параметр в
function:
"a"
— Append — добавит в конец файла
"w"
— Write — перезапишет существующее содержимое
Пример
Открыть файл «demofile2 . txt» и добавить содержимое в файл:
f = открыть(«demofile2.txt», «a»)
f.write(«Теперь в файле больше содержимого!»)
f.close()
# открыть и прочитать файл после добавления:
f =
open(«demofile2.txt», «r»)
print(f.read())
Пример запуска »
Пример
Откройте файл «demofile3.txt» и перезапишите содержимое:
f = open(«demofile3.txt», «w»)
f.write(«Упс! Я удалил содержимое!»)
f.close()
# открыть и прочитать файл после добавления:
f = открыть(«demofile3.txt», «r»)
print(f.read())
Пример запуска »
Примечание: метод «w» перезапишет весь файл.
Создать новый файл
Чтобы создать новый файл в Python, используйте метод open()
,
с одним из следующих параметров:
"x"
— Create — создаст файл, возвращает
ошибка, если файл существует
"a"
— Append — создаст файл, если
указанный файл не существует
"w"
— Запись — создаст файл, если
указанный файл не существует
Пример
Создать файл с именем «myfile. txt»:
f = open(«myfile.txt», «x»)
Результат: создан новый пустой файл!
Пример
Создать новый файл, если он не существует:
f = open(«myfile.txt», «w»)
❮ Предыдущий Следующий ❯
ВЫБОР ЦВЕТА
Лучшие учебники
Учебное пособие по HTMLУчебное пособие по CSS
Учебное пособие по JavaScript
Учебное пособие
Учебное пособие по SQL
Учебное пособие по Python
Учебное пособие по W3.CSS
Учебное пособие по Bootstrap
Учебное пособие по PHP
Учебное пособие по Java
Учебное пособие по C++
Учебное пособие по jQuery
Top References Справочник по HTML
Справочник по CSS
Справочник по JavaScript
Справочник по SQL
Справочник по Python
Справочник по W3.CSS
Справочник по Bootstrap
Справочник по PHP
Цвета HTML
Справочник по Java
Справочник по Angular
Справочник по jQuery
Основные примеры
Примеры HTMLПримеры CSS
Примеры JavaScript
Примеры инструкций
Примеры SQL
Примеры Python
Примеры W3. CSS
Примеры Bootstrap
Примеры PHP
Примеры Java
Примеры XML
Примеры jQuery
FORUM | О
W3Schools оптимизирован для обучения и обучения. Примеры могут быть упрощены для улучшения чтения и обучения. Учебники, ссылки и примеры постоянно пересматриваются, чтобы избежать ошибок, но мы не можем гарантировать полную правильность всего содержания. Используя W3Schools, вы соглашаетесь прочитать и принять наши условия использования, куки-файлы и политика конфиденциальности.
Copyright 1999-2022 Refsnes Data. Все права защищены.
W3Schools работает на основе W3.CSS.
Все, что вам нужно знать
Работа с файлами — одна из наиболее частых операций, которые приходится выполнять программистам, особенно когда задействовано много операций, ориентированных на данные. Работа с такими файлами, как текстовые файлы, двоичные сценарии, листы Excel и т. д., является одним из распространенных вариантов использования. Хотя существуют расширенные библиотеки для работы с таблицами Excel и файлами CSV, которые содержат огромное количество данных, если вы хотите работать с файлами, которые содержат относительно меньше данных, вы можете просто использовать один из многих встроенных методов, предоставляемых Python для работать с файлами.
В этой статье вы узнаете, как открыть файл в Python. Но прежде чем вы перейдете к изучению этих методов, вам необходимо понять различные типы файлов, с которыми Python позволяет вам работать, и режимы, которые можно использовать для доступа к ним. Итак, без дальнейших церемоний, давайте начнем.
Открытие файла
Как обсуждалось ранее, вы можете работать с файлами и манипулировать ими в скрипте Python. Предположим, вы хотите использовать определенный набор данных, хранящихся в текстовом файле, и вам нужно выполнить над ним некоторые операции или отфильтровать его. В таком случае вам потребуется сначала открыть файл, внести необходимые изменения или просто получить доступ к данным и закрыть его. Именно так вы бы сделали это, используя файловые менеджеры с графическим интерфейсом. То же самое и с операторами Python.
Python имеет встроенный метод open(), который позволяет вам открывать файлы и создавать файловый объект. Общий синтаксис метода open() —
.FileObject = open(r»Имя файла», «Режим доступа и тип файла»)
Вам не нужно импортировать пакет или библиотеку, чтобы использовать этот метод. Вместе с командой необходимо указать два параметра.
Имя файла
Здесь вы можете указать только имя файла или полный путь к файлу. Если вы просто включаете имя файла, вам нужно убедиться, что скрипт Python и текстовый файл находятся в одном каталоге. Но если вы хотите указать путь к файлу, вам нужно убедиться, что вы включили символ «r» перед путем к файлу. Это гарантирует, что интерпретатор обрабатывает путь к файлу как необработанную строку. Например, если путь к файлу содержит каталог с именем \temp, то интерпретатор выдаст ошибку, потому что он будет читать \t как специальный символ с именем табуляция.
Режим доступа
Здесь вам нужно определить, какой режим доступа вы хотите предоставить к файлу и какой тип файла вы хотите открыть. Python позволяет читать, писать и добавлять в файл. Буквы р, ш и а. обозначьте их. Наряду с этим вы можете указать тип файла. Для текстового файла вы можете включить букву «t», а для двоичного файла вы можете включить букву «b». Если вы не укажете тип файла, по умолчанию он понимает, что вы предоставили текстовый файл. Следовательно, если вы хотите предоставить доступ для записи к двоичному файлу, параметр будет «wb».
Кроме того, существуют различные варианты каждого режима. Давайте обсудим их все.
Режим доступа | Использовать |
‘х’ | Используется для создания нового пустого файла. |
«р» | Используется для открытия файла в режиме только для чтения. Более того, файл должен существовать до того, как вы будете использовать этот режим. |
‘ш’ | Используется для открытия файла в режиме только для записи. Если файл уже существует, он усекается до 0 символов или перезаписывается предоставленным вами содержимым. Если его нет, то он создается. |
«а» | Также используется для открытия файла в режиме только для записи. Если файл уже существует, он остается нетронутым, а содержимое добавляется в конце. Но если файл не существует, он создается. |
«р+» | Используется для открытия файла как для чтения, так и для записи, и файл должен существовать. |
‘ж+’ | Также используется для открытия файла как для чтения, так и для записи. Если он уже существует, то он либо усекается, либо перезаписывается. Если он не существует, он создается. |
«а+» | Также используется для открытия файла как для чтения, так и для записи. Единственное отличие состоит в том, что если файл уже существует, содержимое добавляется в конец. Если нет, то он создается. |
Как правило, режимы доступа также определяют расположение дескриптора файла. Дескриптор файла аналогичен положению курсора в файле. В зависимости от режима доступа определяется расположение дескриптора файла. Например, в режиме добавления дескриптор файла находится в конце файла. А в режиме чтения дескриптор файла находится в начале файла.
Далее рассмотрим приведенный ниже код.
myfile1 = открыть («simplilearn.txt», «w»)
myfile2 = open(r»/home/jarvis/Documents/simplilearn.txt», «r+»)
Здесь вы создали два файловых объекта для одного и того же файла. Первый напрямую использует имя файла. Это не приведет к ошибке, потому что текстовый файл и скрипт Python находятся в одном каталоге. Следующий — указать путь к файлу. Вам нужно использовать символ r в начале, чтобы интерпретатор читал путь как необработанную строку.
Используем открытый метод с разными режимами доступа.
Попробуем прочитать содержимое файла в файловый объект и распечатать его.
myfile1 = открыть («simplilearn.txt», «r»)
печать (myfile1.read())
myfile1.close()
Здесь вы использовали метод открытия и указали имя файла вместе с режимом доступа для чтения. Затем вы вызвали метод read() для файлового объекта и распечатали его содержимое. Затем вы закрыли файловый объект, чтобы избежать потери памяти и ресурсов.
Вы можете писать в файл, используя два разных метода — write() и writelines(). Метод write() просто записывает одну строку в качестве новой строки. Метод writelines берет список строк и записывает их в файл. Давайте посмотрим на пример для них обоих.
inputList = [«Здравствуйте и добро пожаловать в Simplilearn\n», «У нас есть множество бесплатных и платных курсов для вас\n»]
inputString = «Здравствуйте и добро пожаловать\n»
myfile1 = открыть («simplilearn. txt», «w»)
myfile1.write(inputString)
myfile1.close()
print(«Используя метод записи…»)
myfile1 = открыть («simplilearn.txt», «r»)
печать (myfile1.read())
myfile1.close()
myfile2 = открыть(«simplilearn.txt», «w»)
myfile2.writelines (список ввода)
myfile2.close()
print(«Используя метод writelines…»)
myfile2 = открыть («simplilearn.txt», «r»)
печать (myfile2.read())
myfile2.close()
Здесь вы видели создание списка строк и простой строки. Сначала вы открыли файловый объект в режиме записи и использовали метод записи для записи простой строки в файл, а затем закрыли его, используя метод закрытия файлового объекта. Затем вы открыли объект файла в режиме чтения и распечатали содержимое, которое вы только что написали, используя метод записи, и снова закрыли объект. Далее вы сделали то же самое для метода writelines. Давайте проверим вывод программы.
Чтобы создать более чистый, интуитивно понятный и эффективный код, вы можете использовать оператор with. Если вы используете оператор with, вам не нужно закрывать файловый объект. Он автоматически позаботится о выделении ресурсов и освободит пространство и ресурсы, как только вы выйдете из блока with. Общий синтаксис —
.с открытым <имя_файла> как файл
Давайте разберемся с этим на примере.
inputList = [«Здравствуйте и добро пожаловать в Simplilearn\n», «У нас есть множество бесплатных и платных курсов для вас\n»]
с открытым («simplilearn.txt», «w») как myfile:
myfile.writelines(inputList)
с open(«simplilearn.txt», «r») как myfile:
print(myfile.read())
Здесь в первом блоке with вы открыли файл в режиме записи и вставили несколько предложений методом writelines. В следующем блоке with вы открыли его в режиме чтения и распечатали содержимое. Вам не нужно вызывать метод close для файловых объектов, так как операторы with автоматически позаботятся об этом.
Ждете перехода в область программирования? Пройдите курс обучения Python и начните свою карьеру профессионального программиста Python
Подведение итогов!
Подводя итог, в этой статье вы увидели, как открыть файл в Python и зачем вообще это нужно.