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 .