Ввод и вывод данных — файлы и директории

Введение

Примеры

  • 11

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

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

    импортировать os.path, если os.path.isfile (fname): с open ("fname", "w") как fout: # Работать с вашим открытым файлом else: # Ваша обработка ошибок здесь
  • 7

    Чтение файла построчно

    Самый простой способ перебирать файл построчно:

     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)
    
     

    Это напечатало бы следующее:

    Строка 0: привет

    Линия 1: мир

  • 4

    Получение полного содержимого файла

    Предпочтительный способ ввода / вывода файла заключается в использовании 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 
  • 4

    Запись в файл

     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 # пишет в выходной файл

    В отличие от использования функции записи, функция печати автоматически добавляет разрывы строк.

  • 0

    Копирование содержимого одного файла в другой файл

     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) 
  • 1

    Проверьте, существует ли файл или путь

    Трудоустроить ЭСПЦ стиль кодирования и 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 
  • 0

    Скопируйте дерево каталогов

     import shutil
    source='//192.168.1.2/Daily Reports'
    destination='D:\\Reports\\Today'
    shutil.copytree(source, destination)  
    
     

    Каталог назначения не должен уже существовать.

  • 5

    Итерация файлов (рекурсивно)

    Для итерации всех файлов, в том числе в подкаталогах, используйте 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)
  • 0

    Прочитать файл между строк

    Итак, давайте предположим, что вы хотите выполнять итерацию только между некоторыми конкретными строками файла

    Вы можете использовать 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() заявление здесь как две методики обхода файла не должны быть смешаны вместе

  • 1

    Случайный доступ к файлам с помощью 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() 
  • 0

    Проверка, если файл пуст

     >>> 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 значение.

Синтаксис

Параметры

Примечания