Python Language
Файлы и папки I / O
Поиск…
Вступление
Когда речь идет о хранении, чтении или передаче данных, работа с файлами операционной системы необходима и проста с помощью Python. В отличие от других языков, где ввод и вывод файлов требует сложного чтения и записи объектов, Python упрощает процесс, требуя только команд для открытия, чтения / записи и закрытия файла. В этом разделе объясняется, как Python может взаимодействовать с файлами в операционной системе.
Синтаксис
- file_object = open (имя_файла [, access_mode] [, буферизация])
параметры
параметр | подробности |
---|---|
имя файла | путь к вашему файлу или, если файл находится в рабочем каталоге, имя файла вашего файла |
access_mode | строковое значение, определяющее способ открытия файла |
буферизация | целочисленное значение, используемое для необязательной буферизации строк |
замечания
Избегайте кросс-платформенного кодирования Ад
При использовании встроенного open()
Python лучше всего всегда передавать аргумент encoding
, если вы намерены использовать ваш код для кросс-платформенного. Причина этого заключается в том, что стандартная кодировка системы отличается от платформы к платформе.
Хотя linux
системы действительно используют utf-8
по умолчанию, это не обязательно верно для MAC и Windows.
Чтобы проверить кодировку по умолчанию, попробуйте следующее:
import sys
sys.getdefaultencoding()
от любого интерпретатора python.
Следовательно, разумно всегда выделять кодировку, чтобы убедиться, что строки, с которыми вы работаете, закодированы как то, что вы думаете, что они обеспечивают, кросс-платформенная совместимость.
with open('somefile.txt', 'r', encoding='UTF-8') as f:
for line in f:
print(line)
Режимы файлов
Существуют разные режимы, с помощью которых вы можете открыть файл, заданный параметром mode
. Они включают:
'r'
- режим чтения. По умолчанию. Это позволяет вам читать только файл, а не изменять его. При использовании этого режима файл должен существовать.'w'
- режим записи. Он создаст новый файл, если он не существует, иначе он удалит файл и позволит вам записать его.'a'
- добавить режим. Он будет записывать данные в конец файла. Он не стирает файл, и файл должен существовать для этого режима.'rb'
- режим чтения в двоичном формате. Это похоже наr
за исключением того, что чтение принудительно в двоичном режиме. Это также выбор по умолчанию.'r+'
- режим чтения и режим записи одновременно. Это позволяет одновременно читать и записывать файлы без использованияr
иw
.'rb+'
- режим чтения и записи в двоичном формате. То же, что иr+
за исключением данных в двоичном'wb'
- режим записи в двоичном формате. То же, что иw
за исключением данных, находится в двоичном формате.'w+'
- режим записи и чтения. Точно так же, как иr+
но если файл не существует, создается новый. В противном случае файл будет перезаписан.'wb+'
- режим записи и чтения в двоичном режиме. То же, что иw+
но данные находятся в двоичном формате.'ab'
- добавление в двоичном режиме. Как иa
исключением того, что данные находятся в двоичном формате.'a+'
- режим добавления и чтения. Подобноw+
поскольку он создаст новый файл, если файл не существует. В противном случае указатель файла находится в конце файла, если он существует.'ab+'
- режим добавления и чтения в двоичном формате. То же, чтоa+
за исключением того, что данные находятся в двоичном формате.with open(filename, 'r') as f: f.read() with open(filename, 'w') as f: f.write(filedata) with open(filename, 'a') as f: f.write('\n' + newdata)
р | г + | вес | ш + | а + | ||
---|---|---|---|---|---|---|
Читать | ✔ | ✔ | ✘ | ✔ | ✘ | ✔ |
Написать | ✘ | ✔ | ✔ | ✔ | ✔ | ✔ |
Создает файл | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ |
Стирает файл | ✘ | ✘ | ✔ | ✔ | ✘ | ✘ |
Исходное положение | Начните | Начните | Начните | Начните | Конец | Конец |
Python 3 добавил новый режим для exclusive creation
чтобы вы случайно не усекали или не перезаписывали и не добавляли существующий файл.
-
'x'
- открыт для исключительного создания, подниметFileExistsError
если файл уже существует -
'xb'
- открыт для режима создания уникального создания в двоичном формате. То же, что иx
кроме данных, находится в двоичном формате. -
'x+'
- режим чтения и записи. Подобноw+
поскольку он создаст новый файл, если файл не существует. В противном случае будет увеличено значениеFileExistsError
. -
'xb+'
- режим записи и чтения. Точно так же, какx+
но данные двоичные
Икс | х + | |
---|---|---|
Читать | ✘ | ✔ |
Написать | ✔ | ✔ |
Создает файл | ✔ | ✔ |
Стирает файл | ✘ | ✘ |
Исходное положение | Начните | Начните |
Позвольте написать файл открытого кода более питоническим образом:
try:
with open("fname", "r") as fout:
# Work with your open file
except FileExistsError:
# Your error handling goes here
В Python 2 вы бы сделали что-то вроде
import os.path
if os.path.isfile(fname):
with open("fname", "w") as fout:
# Work with your open file
else:
# Your error handling goes here
Чтение файла по очереди
Самый простой способ перебора файлов по строкам:
with open('myfile.txt', 'r') as fp:
for line in fp:
print(line)
readline()
позволяет более детально управлять последовательной итерацией. Пример ниже эквивалентен приведенному выше:
with open('myfile.txt', 'r') as fp:
while True:
cur_line = fp.readline()
# If the result is an empty string
if cur_line == '':
# We have reached the end of the file
break
print(cur_line)
Использование итератора for loop и readline () вместе считается плохой практикой.
Чаще всего метод readlines()
используется для хранения итерируемой коллекции строк файла:
with open("myfile.txt", "r") as fp:
lines = fp.readlines()
for i in range(len(lines)):
print("Line " + str(i) + ": " + line)
Это напечатает следующее:
Строка 0: привет
Линия 1: мир
Получение полного содержимого файла
Предпочтительный способ ввода / вывода файла заключается в использовании with
ключевым словом. Это гарантирует, что дескриптор файла будет закрыт после завершения чтения или записи.
with open('myfile.txt') as in_file:
content = in_file.read()
print(content)
или, чтобы справиться с закрытием файла вручную, вы можете отказаться with
и просто позвонить close
себя:
in_file = open('myfile.txt', 'r')
content = in_file.read()
print(content)
in_file.close()
Имейте в виду, что без использования инструкции with
вы можете случайно открыть файл в случае возникновения непредвиденного исключения:
in_file = open('myfile.txt', 'r')
raise Exception("oops")
in_file.close() # This will never be called
Запись в файл
with open('myfile.txt', 'w') as f:
f.write("Line 1")
f.write("Line 2")
f.write("Line 3")
f.write("Line 4")
Если вы откроете myfile.txt
, вы увидите, что его содержимое:
Линия 1Line 2Line 3Line 4
Python автоматически не добавляет разрывы строк, вам нужно сделать это вручную:
with open('myfile.txt', 'w') as f:
f.write("Line 1\n")
f.write("Line 2\n")
f.write("Line 3\n")
f.write("Line 4\n")
Строка 1
Строка 2
Строка 3
Строка 4
Не используйте os.linesep
в качестве ограничителя строк при записи файлов, открытых в текстовом режиме (по умолчанию); Вместо этого используйте \n
.
Если вы хотите указать кодировку, вы просто добавляете параметр encoding
в open
функцию:
with open('my_file.txt', 'w', encoding='utf-8') as f:
f.write('utf-8 text')
Также можно использовать оператор печати для записи в файл. Механика отличается от Python 2 и Python 3, но концепция та же самая, что и вы можете сделать вывод, который бы вышел на экран и отправить его в файл.
with open('fred.txt', 'w') as outfile:
s = "I'm Not Dead Yet!"
print(s) # writes to stdout
print(s, file = outfile) # writes to outfile
#Note: it is possible to specify the file parameter AND write to the screen
#by making sure file ends up with a None value either directly or via a variable
myfile = None
print(s, file = myfile) # writes to stdout
print(s, file = None) # writes to stdout
В Python 2 вы бы сделали что-то вроде
outfile = open('fred.txt', 'w')
s = "I'm Not Dead Yet!"
print s # writes to stdout
print >> outfile, s # writes to outfile
В отличие от функции записи функция печати автоматически добавляет разрывы строк.
Копирование содержимого одного файла в другой файл
with open(input_file, 'r') as in_file, open(output_file, 'w') as out_file:
for line in in_file:
out_file.write(line)
- Использование
shutil
модуля:
import shutil
shutil.copyfile(src, dst)
Проверьте, существует ли файл или путь
Используйте стиль кодирования EAFP и try
открыть его.
import errno
try:
with open(path) as f:
# File exists
except IOError as e:
# Raise the exception if it is not ENOENT (No such file or directory)
if e.errno != errno.ENOENT:
raise
# No such file or directory
Это также позволит избежать условий гонки, если другой процесс удаляет файл между проверкой и когда он используется. Это состояние гонки может произойти в следующих случаях:
Использование модуля
os
:import os os.path.isfile('/path/to/some/file.txt')
Использование
pathlib
:import pathlib path = pathlib.Path('/path/to/some/file.txt') if path.is_file(): ...
Чтобы проверить, существует ли данный путь или нет, вы можете выполнить описанную выше процедуру EAFP или явно проверить путь:
import os
path = "/home/myFiles/directory1"
if os.path.exists(path):
## Do stuff
Скопировать дерево каталогов
import shutil
source='//192.168.1.2/Daily Reports'
destination='D:\\Reports\\Today'
shutil.copytree(source, destination)
Целевой каталог уже не должен существовать .
Итерировать файлы (рекурсивно)
Чтобы итератировать все файлы, в том числе в подкаталогах, используйте os.walk:
import os
for root, folders, files in os.walk(root_dir):
for filename in files:
print root, filename
root_dir может быть "." для запуска из текущего каталога или любого другого пути для начала.
Если вы также хотите получить информацию о файле, вы можете использовать более эффективный метод os.scandir следующим образом:
for entry in os.scandir(path):
if not entry.name.startswith('.') and entry.is_file():
print(entry.name)
Чтение файла между диапазоном строк
Итак, давайте предположим, что вы хотите итерации только между некоторыми конкретными строками файла
Вы можете использовать itertools
для этого
import itertools with open('myfile.txt', 'r') as f: for line in itertools.islice(f, 12, 30): # do something here
Это будет читать строки с 13 по 20, так как при индексации python начинается с 0. Так что строка номер 1 индексируется как 0
Также можно прочитать некоторые дополнительные строки, используя здесь next()
ключевое слово.
И когда вы используете файл-объект как итеративный, не используйте здесь инструкцию readline()
поскольку два метода перемещения файла не должны смешиваться
Случайный доступ к файлам с помощью mmap
Использование модуля mmap
позволяет пользователю случайным образом обращаться к местоположениям в файле путем сопоставления файла в память. Это альтернатива использованию обычных файловых операций.
import mmap
with open('filename.ext', 'r') as fd:
# 0: map the whole file
mm = mmap.mmap(fd.fileno(), 0)
# print characters at indices 5 through 10
print mm[5:10]
# print the line starting from mm's current position
print mm.readline()
# write a character to the 5th index
mm[5] = 'a'
# return mm's position to the beginning of the file
mm.seek(0)
# close the mmap object
mm.close()
Замена текста в файле
import fileinput
replacements = {'Search1': 'Replace1',
'Search2': 'Replace2'}
for line in fileinput.input('filename.txt', inplace=True):
for search_for in replacements:
replace_with = replacements[search_for]
line = line.replace(search_for, replace_with)
print(line, end='')
Проверка того, что файл пуст
>>> import os
>>> os.stat(path_to_file).st_size == 0
или же
>>> import os
>>> os.path.getsize(path_to_file) > 0
Тем не менее, оба будут генерировать исключение, если файл не существует. Чтобы избежать такой ошибки, сделайте следующее:
import os
def is_empty_file(fpath):
return os.path.isfile(fpath) and os.path.getsize(fpath) > 0
который вернет значение bool
.