Введение

Примеры

Файловые режимы

Существуют различные режимы вы можете открыть файл с, указанные в 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 значение.

Синтаксис

Параметры

Примечания