Содержание

Как работать с файлами в Python

В любом проекте разработки ПО нам приходится работать с файлами. При помощи Python можно осуществлять довольно много операций. Мы можем:

  • выводить список файлов
  • перемещать и переименовывать файлы
  • удалять файлы
  • читать файлы
  • записывать в файлы
  • добавлять что-либо в файлы

Наверняка можно делать что-то еще, но это те базовые операции, которые мы разберем в этой статье.

Чтобы сэкономить время и лучше изложить материал, я сгруппировал некоторые темы.

Вывод списка файлов и их переименование

В этом разделе я покажу вам, что можно делать при помощи модуля os в Python. Если вы гик вроде меня и хотите иметь возможность переименовывать файлы в соответствии с определенными правилами, Python вам поможет.

Для начала нам нужно получить список всех файлов. После этого мы будем выбирать файлы по одному и переименовывать.

[python_ad_block]

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

Насколько я знаю, в модуле os нет специального метода, который возвращал бы имена только файлов. Поэтому, получив список файлов и директорий, нам придется отсеять директории. Для этого мы можем воспользоваться методом os.path.isfile() из модуля os. Этот метод возвращает True, если аргумент является файлом. Аналогично, метод os.path.isdir() возвращает True, если аргумент является директорией.

import os # returns name of all files & directory exist in current location files_dir = os.listdir('./blogs') print(files_dir) only_files = [] for i in files_dir: if os.path.isfile('./blogs/'+i): only_files.append(i) only_dir = [] for i in files_dir: if os.path.isdir('./blogs/'+i): only_dir.append(i) print('-'*15) print(only_files) # prints all files print('-'*15) print(only_dir) # prints all directories """ OUTPUT: ['1.txt', '2.txt', '3. txt', '4.txt', '5.txt', '6.txt', '7.txt', '8.txt', 'Test Directory 1', 'Test Directory 2'] --------------- ['1.txt', '2.txt', '3.txt', '4.txt', '5.txt', '6.txt', '7.txt', '8.txt'] --------------- ['Test Directory 1', 'Test Directory 2'] """

Итак, мы получили список всех файлов.

Как переименовать файлы в Python

Чтобы переименовать файлы, мы воспользуемся методом rename() и применим его к каждому файлу. Предположим, мы хотим добавить к файлам префиксы «Odd» (нечетный) и «Even» (четный), основываясь на индексах.

# only_files is a list of all files in the blogs directory
for index, file_name in enumerate(only_files):
    if index % 2 == 0:
        os.rename('./blogs/'+file_name, './blogs/'+'Even-'+file_name)
    else:
        os.rename('./blogs/'+file_name, '.
/blogs/'+'Odd-'+file_name)

Здесь метод enumerate() возвращает номер по счетчику (начинается с 0) и значение из итератора (only_files). Мы проверяем, является ли индекс (номер по счетчику) четным, и если да — добавляем префикс «Even» к имени файла. В противном случае добавляем префикс «Odd».

Подробнее о функции

enumerate() можно почитать в статье «Как работает функция enumerate() в Python?».

Вероятно, синтаксис метода os.rename() вы поняли, но на всякий случай приведу его:

os.rename(текущее_имя, новое_имя)

При использовании этого метода имена (пути) можно писать как целиком, так и в относительном формате (главное — написать правильно). В нашем случае я написал «./blog/». Вторая косая черта указывает на вход внутрь директории blogs. Таким образом, путь к файлу превращается в «./blogs/1.txt».

Перемещение и удаление файлов в Python

Чтобы переместить файл, мы можем воспользоваться модулем os или модулем shutil.

Я покажу перемещение файла при помощи метода rename() из модуля os.

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

os.rename(исходное_местонахождение, целевое_местонахождение)

Вероятно, это звучит запутано, но пример вам все объяснит:

import os
os.rename('./blogs/1.txt', './blogs/Test Directory 1/1.txt')
os.rename('./blogs/2.txt', './blogs/Test Directory 2/1.txt')

Итак, в первом методе rename мы берем файл 1.txt из директории blogs и перемещаем его в директорию Test Directory 1, которая является поддиректорией blogs.

Во втором сценарии мы берем файл 2.txt и тоже перемещаем его в директорию Test Directory 1, но с именем 1. txt. Да, мы перемещаем и переименовываем файл одновременно. Если вы немного знакомы с командами Linux, вы могли заметить что работа метода os.rename() напоминает работу команды mv

в Linux.

А как нам теперь удалить эти файлы?

Нам снова поможет модуль os. Мы воспользуемся методом remove(). Допустим, мы хотим удалить файл 3.txt из директории blogs. Для этого напишем следующий код:

import os
os.remove('./blogs/3.txt')

Чтение файлов и запись в них

Чтобы выполнить любую из операций чтения и записи, нам нужно сделать три основных шага:

  1. Открыть файл
  2. Выполнить операцию
  3. Закрыть файл

Мы можем проделывать эти шаги, используя два паттерна. Объяснить их на словах сложно, так что я сделаю это при помощи кода.

# Открыть файл
file = open('./blogs/1.txt', 'r', encoding="UTF-8")
# Выполнить операцию
data = file.read()
print(data)
# Закрыть файл
file.close()
"""
OUTPUT:
Python 101 Series
"""

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

. Для открытия файла Python предоставляет метод open(). Синтаксис:

open(файл, режим_доступа, кодировка)

Файл — это местонахождение объекта файла. Режим_доступа представляет режим, в котором мы хотим открыть файл. Вообще можно делать больше одной операции за раз, но об этом позже. Кодировка представляет формат кодировки, в которой мы хотим работать с файлом. Этот параметр опционален. Чаще всего используется UTF-8.

Второй паттерн:

with open('. /blogs/1.txt', 'r', encoding="UTF-8") as file: data = file.read() print(data)

Здесь мы используем паттерн контекстного менеджера. Если быть кратким, паттерн контекстного менеджера используется для разумного расходования ресурсов. Проблема первого паттерна в том, что мы можем забыть закрыть файл. В нашем примере это не слишком важно, но если вы оперируете тысячами или даже миллионами файлов, подобная ошибка повлияет на вашу систему. Паттерн контекстного менеджера освобождает ресурсы, как только мы покончили с задачей.

От редакции Pythonist. О контекстных менеджерах можно почитать в статье «Контекстные менеджеры в Python».

Итак, в первой строке мы открываем файл при помощи синтаксиса with open() и присваиваем его переменной file. Мы могли бы сделать то же самое, написав file = open(). Преимущество нашего варианта в том, что Python автоматически освободит этот ресурс после третьей строки.

Поскольку после третьей строки мы окажемся вне контекста with open(), все ресурсы, связанные с переменной file, будут освобождены. Вы будете часто встречать паттерны контекстных менеджеров в коде для обработки файлов в продакшен-системах.

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

with open('./blogs/temp.txt', 'w', encoding="UTF-8") as file:
    data = "Python 101 Series"
    file.write(data)

Если файл с таким именем существует, он будет перезаписан новыми данными. А если такого файла нет, он будет создан и в него будут записаны данные. При этом следует учитывать, что создается только новый файл, директория создана не будет. Если я напишу open(«./blogs/temp/temp.txt», «w»), код выбросит ошибку, потому что внутри директории

blogs нет директории temp.

Чтобы данные в файле не перезаписывались, а дополнялись, можно воспользоваться методом append (в коде — аргумент 'a'). Он добавляет данные в конец открытого файла.

with open('./blogs/temp.txt', 'a') as file:
    data = "\n New Python 101 Series"
    file.write(data)

В этом коде сперва Python проверит, существует ли файл temp.txt, затем откроет его и добавит «\n New Python 101 Series» в конец файла. Если файл не существует, Python его создаст и запишет в него эту строку.

Режимы доступа к файлам

Я собрал базовые режимы доступа к файлам в таблице. Но есть и другие режимы, позволяющие оперировать бинарными данными и в бинарном формате. Полный список можно посмотреть в статье «File Access mode In Python».

РежимОбъяснение
rчтение
wзапись
aдобавление в файл
r+Чтение и запись данных в файл. Предыдущие данные в файле не удаляются.
w+Запись и чтение данных. Существующие данные перезаписываются.
a+Добавление и чтение данных из файла. Существующие данные не перезаписываются.

Заключение

В этой статье мы на простых примерах разобрали, как работать с файлами в Python. Я знаю, что запомнить все это за один раз сложно. Но это и не нужно: все придет с практикой, главное — разобраться.

Перевод статьи «File Handling in Python».

Методы открытого файла в Python.

Python предоставляет основные методы, необходимые для работы с открытыми файлами. Можно произвести практически любую операцию, действие, манипуляцию с файлом и данными хранящимся в нем, используя объект файла file object.

Прежде чем начинать что-то делать с файлом, его необходимо открыть его с помощью встроенной функции open(). Эта функция создает объект файла file object, который будет использоваться для вызова методов, которые представлены ниже.

Примечание. В зависимости от режима открытия файла mode, описанного в документации по встроенной функции open(), можно будет:

  • работать с текстовыми или байтовыми данными;
  • только читать данные из файла;
  • создать файл и записать данные;
  • очистить существующий файл и записать данные;
  • дописать информацию в конец файла;
  • и т. д., вариантов много.

Так же в функции open() можно установить желаемую кодировку файла.


Метод file.close() в Python, закрывает файл.

Метод file.close() закрывает открытый файл. Закрытый файл больше не может быть прочитан или записан. Любая операция, которая требует, чтобы файл был открыт, вызовет исключение ValueError после того, как файл был закрыт.

Метод file.flush() в Python, очищает буфер чтения.

Метод file.flush() очищает внутренний буфер. Обычно используется только для выходного потока. Его цель — очистить выходной буфер и переместить буферизованные данные на диск.

Метод file.fileno() в Python, получает файловый дескриптор.

Метод файла file.fileno() возвращает целочисленный файловый дескриптор, который используется базовой реализацией для запроса операций ввода-вывода из операционной системы.

Метод file.isatty() в Python, проверяет связь с терминалом.

Метод файла file.isatty() возвращает True, если файл подключен/связан с терминальным устройством tty или с tty-подобным устройством, иначе возвратит False.

Метод file.read() в Python, читает весь файл или кусками.

Метод файла file.read() считывает из файла не более size байтов. Если достигается конец файла EOF до получения указанного размера size байтов, тогда метод считает только доступные байты.

Метод file.readline() в Python, читает файл построчно.

Метод файла file.readline() читает одну целую строку из файла. Конечный символ новой строки \n сохраняется в строке.

Метод file.readlines() в Python, получает список строк файла.

Метод файла file. readlines() читает файловый объект построчно, пока не достигнет конца файла EOF, и возвращает список, содержащий строки файла.

Метод file.seek() в Python, перемещает указатель в файле.

Метод файла file.seek() устанавливает текущую позицию offset указателя для чтения/записи в файле file.

Метод file.tell() в Python, позиция указателя в файле.

Метод файла file.tell() возвращает текущую позицию указателя чтения/записи в файле в байтах.

Метод file.truncate() в Python, усекает размер файла.

Метод файла file.truncate() усекает размер файла. Если указан необязательный аргумент size, файл усекается до этого (максимально) размера.

Метод file.write() в Python, пишет данные в файл.

Метод файла file.write() записывает строку str в файл file. Метод возвращает целое число — количество записанных байт.

Метод file.writelines() в Python, пишет список строк в файл.

Метод файла file.writelines() записывает последовательность строк в файл file.

Python — чтение и запись файлов

В Python модуль ввода-вывода предоставляет методы трех типов операций ввода-вывода; необработанные двоичные файлы, буферизованные двоичные файлы и текстовые файлы. Канонический способ создания файлового объекта — использование функции open() .

Любые операции с файлами можно выполнять в следующие три шага:

  1. Откройте файл, чтобы получить файловый объект, используя встроенную функцию open(). Существуют различные режимы доступа, которые вы можете указать при открытии файла с помощью функции open().
  2. Выполнение операций чтения, записи и добавления с использованием файлового объекта, полученного из функции open() .
  3. Закрыть и удалить файловый объект.

Чтение файла

Объект File включает следующие методы для чтения данных из файла.

  • read(chars): читает указанное количество символов, начиная с текущей позиции.
  • readline(): читает символы, начиная с текущей позиции чтения до символа новой строки.
  • readlines(): читает все строки до конца файла и возвращает объект списка.

Следующий файл C:\myfile.txt будет использоваться во всех примерах чтения и записи файлов.

 Это первая строка.
Это вторая линия.
Это третья строка.
 

В следующем примере операция чтения выполняется с использованием метода read(chars) .

 >>> f = open('C:\myfile.txt') # открытие файла
>>> lines = f.read() # чтение файла
>>> линии
'Это первая линия. \nЭто вторая строка.\nЭто третья строка.'
>>> f.close() # закрытие файлового объекта
 

Выше, f = open('C:\myfile.txt') открывает myfile.txt в режиме чтения по умолчанию из текущего каталога и возвращает файловый объект. Функция f.read() считывает все содержимое до EOF в виде строки. Если вы укажете аргумент размера символа в методе read(chars) , он будет читать только это количество символов. f.close() очистит и закроет поток.

Чтение строки

В следующем примере показано чтение строки из файла.

 >>> f = open('C:\myfile.txt') # открытие файла
>>> line1 = f.readline() # чтение строки
>>> строка1
'Это первая линия. \n'
>>> line2 = f.readline() # чтение строки
>>> строка2
'Это вторая строка.\n'
>>> line3 = f.readline() # чтение строки
>>> строка 3
— Это третья линия.
>>> line4 = f.readline() # чтение строки
>>> строка4
''
>>> f.close() # закрытие файлового объекта
 

Как видите, мы должны открыть файл в режиме 'r' . Метод readline() вернет первую строку, а затем укажет на вторую строку в файле.

Чтение всех строк

Следующий код считывает все строки с помощью функции readlines() .

 >>> f = open('C:\myfile. txt') # открытие файла
>>> lines = f.readlines() # чтение всех строк
>>> линии
'Это первая линия. \nЭто вторая строка.\nЭто третья строка.'
>>> f.close() # закрытие файлового объекта
 

Файловый объект имеет встроенный итератор. Следующая программа считывает данный файл построчно, пока не будет поднято StopIteration , т. е. не будет достигнут EOF.

 f=открыть('C:\myfile.txt')
пока верно:
    пытаться:
        строка = следующая (е)
        печать (строка)
    кроме StopIteration:
        перерыв
е.закрыть()
 

Используйте цикл for, чтобы легко прочитать файл.

 f=открыть('C:\myfile.txt')
для строки в f:
    печать (строка)
е.закрыть()
 
 Это первая строка.
Это вторая линия.
Это третья строка.
 

Чтение двоичного файла

Используйте режим ‘rb’ в функции open() для чтения двоичных файлов, как показано ниже.

 >>> f = open('C:\myimg. png', 'rb') # открытие бинарного файла
>>> content = f.read() # чтение всех строк
>>> содержание
б'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x08\x00\x00\x00\x08\x08\x06
\x00\x00\x00\xc4\x0f\xbe\x8b\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq
\xc9e\x00\x00\x00\x8dIDATx\xdab\xfc\xff\xff?\x03\x0c0/zP\n\xa4b\x818\xeco\x9c
\xc2\r\x90\x18\x13\x03*8\t\xc4b\xbc\x01\xa8X\x07$\xc0\xc8\xb4\xf0>\\\x11P\xd7?
\xa0\x84\r\x90\xb9\t\x88?\x00q H\xc1C\x16\xc9\x94_\xcc\x025\xfd2\x88\xb1\x04
\x88\x85\x90\x14\xfc\x05\xe2( \x16\x00\xe2\xc3\x8c\xc8\x8e\x84:\xb4\x04H5\x03
\xf1\\ .bD\xf3E\x01\x90\xea\x07\xe2\xd9\xaeB`\x82'
>>> f.close() # закрытие файлового объекта
 

Запись в файл

Файловый объект предоставляет следующие методы для записи в файл.

  • write(s): Запишите строку s в поток и верните количество записанных символов.
  • writelines(lines): Запишите список строк в поток. Каждая строка должна иметь разделитель в конце.

Создать новый файл и записать

Следующее создает новый файл, если он не существует, или перезаписывает существующий файл.

 >>> f = открыть('C:\myfile.txt','w')
>>> f.write("Hello") # запись в файл
5
>>> f.close()
# чтение файла
>>> f = открыть('C:\myfile.txt','r')
>>> f.read()
'Привет'
>>> f.close()
 

В приведенном выше примере оператор f=open("myfile.txt","w") открывает myfile.txt в режиме записи, метод open() возвращает объект файла и присваивает его переменной ф . 'w' указывает, что файл должен быть доступен для записи. Затем f.write("Hello") перезаписывает существующее содержимое файла myfile.txt . Он возвращает количество символов, записанных в файл, которое в приведенном выше примере равно 5. В итоге f.close() закрывает файловый объект.

Добавление к существующему файлу

Следующее добавляет содержимое в конец существующего файла, передавая режим 'a' или 'a+' в методе open() .

 >>> f = открыть('C:\myfile.txt','a')
>>> f.write("Мир!")
7
>>> f.close()
# чтение файла
>>> f = открыть('C:\myfile.txt','r')
>>> f.read()
'Привет, мир!'
>>> f.close()
 

Запись нескольких строк

Python предоставляет метод writelines() для сохранения содержимого объекта списка в файле. Поскольку символ новой строки не записывается в файл автоматически, он должен быть предоставлен как часть строки.

 >>> lines=["Привет, мир.\n", "Добро пожаловать в TutorialsTeacher.\n"]
>>> f=open("D:\myfile.txt", "w")
>>> f.writelines(строки)
>>> f.close()
 

Открытие файла в режиме «w» или «a» может быть только для записи и не может быть прочитано. Точно так же режим «r» позволяет только чтение, а не запись. Для выполнения одновременных операций чтения/добавления используйте режим «a+».

Запись в двоичный файл

Функция open() по умолчанию открывает файл в текстовом формате. Чтобы открыть файл в двоичном формате, добавьте 'b' к параметру режима. Следовательно, режим "rb" открывает файл в двоичном формате для чтения, а режим "wb" открывает файл в двоичном формате для записи. В отличие от текстовых файлов, двоичные файлы не читаются человеком. При открытии в любом текстовом редакторе данные не распознаются.

Следующий код сохраняет список чисел в двоичном файле. Перед записью список сначала преобразуется в массив байтов. Встроенная функция bytearray() возвращает байтовое представление объекта.

 f=открыть("binfile.bin","wb")
число=[5, 10, 15, 20, 25]
массив = массив байтов (число)
ф.написать (обр)
е.закрыть()
 

Learn Python 3: Памятка по файлам

Файловый объект Python

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

 
 

с open('somefile.txt') as file_object:

Затем вы можете распечатать содержимое файлового объекта, file_object с print() .

 
 

print(file_object)

Вы можете увидеть что-то вроде этого на выходном терминале:

 <_io.TextIOWrapper name='somefile.txt' mode='r' encoding='UTF-8'> 

Python Readline Method

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

 
 

с open('story.txt') as story_object:

print(story_object.readline())

напечатает только первую строку в story. txt .

Преобразование файлов JSON в словарь

Формат JSON используется для хранения пар ключ-значение. Модуль Python json позволяет читать такой формат данных и анализировать его в словаре. Функция json.load принимает файловый объект в качестве аргумента и возвращает данные в формате словаря.

 

# Используйте json.load с открытым файловым объектом для чтения содержимого в словарь Python.

# Содержимое file.json

# { 'userId': 10 }

import json

с open('file.json') as json_file:

python_dict = json.load(json_file)

print( python_dict.get('userId'))

# Печатает 10

Python Append To File

Запись в открытый файл с флагом 'w' перезаписывает все предыдущее содержимое в файле. Чтобы избежать этого, мы можем вместо этого добавить в файл. Используйте флаг 'a' в качестве второго аргумента для открыть() . Если файл не существует, он будет создан для режима добавления.

 
 

с open('shopping.txt', 'a') as shop:

shop.write('Помидоры, огурцы, сельдерей\n')

Python Write To File

По умолчанию, файл при открытии с помощью open() предназначен только для чтения. По умолчанию ему передается второй аргумент 'r' . Чтобы записать в файл, сначала откройте файл с разрешением на запись с помощью аргумента 'w' . Тогда используйте .write() метод для записи в файл. Если файл уже существует, все предыдущее содержимое будет перезаписано.

 
 

с open('diary.txt','w') в качестве дневника:

diary.write('Особые события на сегодня')

Метод Python Readlines

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

 
 

с open('lines.txt') as file_object:

file_data = file_object.readlines()

print(file_data)

возвращает список строк в 3 4 5 19004 file_data 9000 . Изучайте Python.\n’, ‘2. Работай усердно.\n’, ‘3. Graduate.’]

Перебор списка, file_data и его печать:

 
 

для строки в file_data:

print(line)

выходы:

05 
 

1. Изучайте Python.

2. Работай усердно.

3. Выпускник.

Класс csv.DictWriter

В Python модуль csv реализует классы для чтения и записи табличных данных в формате CSV . Он имеет класс DictWriter , который работает как обычный модуль записи, но сопоставляет словарь с выходными строками. Ключи словаря — это имена столбцов, а значения — фактические данные.

Конструктор csv.DictWriter принимает два аргумента. Первый — это обработчик открытого файла, в который записывается CSV. Второй именованный параметр, fieldnames — это список имен полей, которые будет обрабатывать CSV.

# Пример csv.DictWriter

import csv

с open('companies.csv', 'w') as csvfile:

fieldnames = ['name', 'type']

Writer = csv .DictWriter(csvfile, fieldnames=fieldnames)

Writer.writeheader()

Writer.writerow({'name': 'Codecademy', 'type': 'Learning'})

author.writerow({'name' : 'Google', 'тип': 'Поиск'})

"""

После запуска приведенного выше кода в файле company.csv будет содержаться следующая информация:

имя, тип

Codecademy,Learning

Google,Search

"""

Метод чтения 5 Python 905468

После открытия файла с помощью функции open() , возвращающей файловый объект, вызовите метод .