Python итерация по файлу

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

Существуют различные режимы вы можете открыть файл с, указанные в 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+ , но данные в двоичной
Читайте также:  Schildt java 11th edition

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

Читайте также:  30 css selectors to memorize

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

Это также позволит избежать гоночных условий, если другой процесс удалил файл между проверкой и временем ее использования. Такое состояние гонки может произойти в следующих случаях:

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

Читайте также:  Таблицы

Источник

Как прочитать файл построчно в Python

Существует много способов чтение из файла построчно в Python. Вы можете считать строки в список или обращаться к каждой из строк в цикле при помощи итератора или вызова функции объекта file.

В этом руководстве мы научимся считывать файл построчно, используя функции readline() , readlines() и объект файла на примерах различных программ.

Пример 1: Чтение файла построчно функцией readline()

В этом примере мы будем использовать функцию readline() для файлового объекта, получая каждую строку в цикле.

Как использовать функцию file.readline()

Следуйте пунктам приведенным ниже для того, чтобы считать файл построчно, используя функцию readline() .

  1. Открываем файл в режиме чтения. При этом возвращается дескриптор файла.
  2. Создаём бесконечный цикл while.
    1. В каждой итерации считываем строку файла при помощи readline() .
    2. Если строка не пустая, то выводим её и переходим к следующей. Вы можете проверить это, используя конструкцию if not . В противном случае файл больше не имеет строк и мы останавливаем цикл с помощью break .
     
     
    # получим объект файла file1 = open("sample.txt", "r") while True: # считываем строку line = file1.readline() # прерываем цикл, если строка пустая if not line: break # выводим строку print(line.strip()) # закрываем файл file1.close
    Привет! Добро пожаловать на PythonRu. Удачи в обучении!

    Пример 2: Чтение строк как список функцией readlines()

    Функция readlines() возвращает все строки файла в виде списка. Мы можем пройтись по списку и получить доступ к каждой строке.

    В следующей программе мы должны открыть текстовый файл и получить список всех его строк, используя функцию readlines() . После этого мы используем цикл for, чтобы обойти данный список.

     
    # получим объект файла file1 = open("sample.txt", "r") # считываем все строки lines = file1.readlines() # итерация по строкам for line in lines: print(line.strip()) # закрываем файл file1.close
    Привет! Добро пожаловать на PythonRu. Удачи в обучении!

    Пример 3: Считываем файл построчно из объекта File

    В нашем первом примере, мы считываем каждую строку файла при помощи бесконечного цикла while и функции readline() . Но Вы можете использовать цикл for для файлового объекта, чтобы в каждой итерации цикла получать строку, пока не будет достигнут конец файла.

    Ниже приводится программа, демонстрирующая применение оператора for-in, для того, чтобы перебрать строки файла.

    Для демонстрации откроем файл с помощью with open. Это применимо и к предыдущим двум примерам.

    Источник

Оцените статью