Поиск…


Вступление

Когда речь идет о хранении, чтении или передаче данных, работа с файлами операционной системы необходима и проста с помощью 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+ но данные двоичные
Икс х +
Читать
Написать
Создает файл
Стирает файл
Исходное положение Начните Начните

Позвольте написать файл открытого кода более питоническим образом:

Python 3.x 3.3
try:
    with open("fname", "r") as fout:
        # Work with your open file
except FileExistsError:
    # Your error handling goes here

В Python 2 вы бы сделали что-то вроде

Python 2.x 2.0
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, но концепция та же самая, что и вы можете сделать вывод, который бы вышел на экран и отправить его в файл.

Python 3.x 3.0
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 вы бы сделали что-то вроде

Python 2.x 2.0
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')
    
Python 3.x 3.4
  • Использование 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 может быть "." для запуска из текущего каталога или любого другого пути для начала.

Python 3.x 3.5

Если вы также хотите получить информацию о файле, вы можете использовать более эффективный метод 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 .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow