Введение
Примеры
Файловые режимы
Существуют различные режимы вы можете открыть файл с, указанные в 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)
r , r+, w ,w+,a, a+
Читать ✔ ✔ ✘ ✔ ✘ ✔
Написать ✘ ✔ ✔ ✔ ✔ ✔
Создает файл ✘ ✘ ✔ ✔ ✔ ✔
Стирает файл ✘ ✘ ✔ ✔ ✘ ✘
Нач. позиция Н Н Н Н К К
Python 3 добавлен новый режим для exclusive creation
, так что вы случайно не укоротить или перезаписать и существующий файл.
'x'
- открыт для исключительного создания, подниметFileExistsError
, если файл уже существует'xb'
- открыть для монопольного режима создания письма в двоичной системе.Же , какx
, за исключением данных в двоичной системе .'x+'
- чтение и запись в режиме. Подобноw+
, как это создаст новый файл , если файл не существует. В противном случае, подниметFileExistsError
.'xb+'
- запись и режим чтения. Точно такой же , какx+
, но данные в двоичной
x | х +
Читать ✘ | ✔
Написать ✔ | ✔
Создает файл ✔ | ✔
Стирает файл ✘ | ✘
Нач. позиция Н | Н
Позвольте одному написать ваш открытый код файла более питоническим способом:
try:
with open("fname", "r") as fout:
# Work with your open file
except FileExistsError:
# Your error handling goes here
В Python 2 вы бы сделали что-то вроде
импортировать os.path, если os.path.isfile (fname): с open ("fname", "w") как fout: # Работать с вашим открытым файлом else: # Ваша обработка ошибок здесь
Чтение файла построчно
Самый простой способ перебирать файл построчно:
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 и readline () считается плохой практикой.
Чаще всего , в readlines()
метод используется для хранения Iterable коллекции строк для каждого файла:
with open("myfile.txt", "r") as fp:
lines = fp.readlines()
for i in range(len(lines)):
print("Line " + str(i) + ": " + line)
Это напечатало бы следующее:
привет
мир
Получение полного содержимого файла
Предпочтительный способ ввода / вывода файла заключается в использовании 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')
Также можно использовать оператор print для записи в файл. Механика в 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 = "Я еще не умер!" print s # пишет в стандартный вывод print >> outfile, s # пишет в выходной файл
В отличие от использования функции записи, функция печати автоматически добавляет разрывы строк.
Копирование содержимого одного файла в другой файл
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)
Проверьте, существует ли файл или путь
Трудоустроить ЭСПЦ стиль кодирования и 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`: импортировать pathlib path = pathlib.Path('/ path / to / some / file.txt'), если 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] (https://docs.python.org/3/library/os.html#os.scandir), например, так: запись в os.scandir (path): если не entry.name.startswith('.') и 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 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
значение.