Программирование на Python: Часть 8. Файловая система
Программирование на Python
Сергей Яковлев
Опубликовано 02.09.2010
Серия контента:
Этот контент является частью # из серии # статей: Программирование на Python
https://www.ibm.com/developerworks/ru/library/?series_title_by=**auto**
Следите за выходом новых статей этой серии.
Этот контент является частью серии:Программирование на Python
После изучения классов в Python мы перейдем к работе с файлами и файловой системой. Функции и объекты, описанные в этой главе, позволят вам сохранять данные между вызовами программы, а также обмениваться данными между программами.
Сегодня мы рассмотрим следующие темы.
- Как открыть файл.
- Базовые файловые методы.
- Стандартный ввод/вывод.
- Произвольный доступ.
- Построчная работа с файлами.
- Закрытие файла.
- Итерация.
- Pickling.
- Бинарные файлы – модуль struct.
- Работа с файловой системой.
1. Как открыть файл
Открыть файл можно с помощью функции open:
open(name[, mode[, buffering]])
Функция возвращает файловый объект. Обязателен только первый аргумент. Если остальные параметры отсутствуют, файл будет доступен на чтение. Таблица режимов (mode) функции open:
‘r’ – чтение.
‘w’ – запись.
‘a’ – добавление.
‘b’ – бинарный режим.
‘+’ – чтение/запись.
Режим ‘+’ может быть добавлен к остальным режимам. По умолчанию питон открывает файлы в текстовом режиме. Для открытия файла в бинарном режиме на чтение можно добавить ‘rb’. Третий параметр устанавливает размер буферизации при работе с файлом. По умолчанию он выключен, и чтение/запись идет напрямую с диска на диск. Для включения буфера третий параметр должен быть отличным от нуля.
2. Базовые файловые методы
В питоне многие объекты являются файлами: стандартный ввод sys.stdin, стандартный вывод sys.stdout, объекты, открываемые функцией urllib.urlopen и т.д.
Запись в файл:
>>> f = open('my_file', 'w') >>> f.write('Hello, ') >>> f.write('World!') >>> f.close()
Чтение:
>>> f = open('my_file', 'r') >>> f.read(5) 'Hello' >>> f.read() ', World!'
3. Стандартный ввод/вывод
В командной строке можно записать подряд несколько команд, передавая результат работы от одной команды к другой по конвейеру – или по каналу (pipe):
cat my_file | python test.py
Первая команда – cat – пишет содержимое текстового файла my_file на стандартный вывод sys.stdout . Вторая команда запускает питоновский файл, который читает стандартный ввод sys.stdin , подсчитывает в нем количество слов и выводит результат:
test.py: import sys text = sys.stdin.read() words = text.split() wordcount = len(words) print 'Wordcount:', wordcount
Канал – или пайп (pipe) – это конструкция, объединяющая стандартный вывод со стандартным вводом и позволяющая обмениваться данными между двумя командами.
4. Произвольный доступ
По умолчанию метод read() читает данные последовательно по порядку, от начала и до конца файла. Для произвольного доступа к файлу есть функция seek:
seek(offset[, whence])
offset – смещение в байтах относительно начала файла;
whence – по умолчанию равен нулю, указывает на то, что смещение берется относительно начала файла.
Пример:
>>> f = open(r'my_file', 'w') >>> f.write('01234567890123456789') >>> f.seek(5) >>> f.write('Hello, World!') >>> f.close() >>> f = open(r'my_file') >>> f.read() '01234Hello, World!89'
Функция tell() возвращает текущую позицию файла.
5. Построчная работа с файлами
Обычно мы имеем дело с текстовыми файлами. Прочитать одну строку:
file.readline()
Функция readline() без параметра читает всю строку, наличие параметра указывает функции максимальное число символов строки, которое будет прочитано. Прочитать все строки и вернуть список строк:
file.readlines()
Записать строки в файл:
file.writelines()
Пример. Прочитать файл и записать его содержимое в другой файл:
f = open(r'my_file') lines = f.readlines() f.close() lines[0] = "This is a my_file2 \n" # изменяем 1-ю строку f = open(r'my_file2','w') f.writelines(lines) f.close()
6. Закрытие файла
Для закрытия файла есть метод close(). Обычно файл закрывается сам после того, как вы выходите из программы, но файлы нужно закрывать вручную по нескольким причинам.
- Питон может буферизировать запись в файл ваших данных, что может привести к неожиданным эффектам и возникновению ошибок.
- У операционной системы есть ограничение на число одновременно открытых файлов.
- При доступе к файлу из разных мест одновременно и на чтение, и на запись необходимо синхронизировать файловые операции. Буферизация записи может привести к тому, что запись уже произошла, а данных в файле еще нет.
Для полной уверенности в закрытии файла можно использовать блок try/finally:
try: # Тут идет запись в файл finally: file.close()
Можно также использовать менеджер контекста, который в любом случае закроет файл:
with open("my_file") as somefile: do_something(somefile)
Если вы все же не хотите закрывать файл, то синхронизировать многопользовательский доступ к файлу на чтение/запись можно с помощью функции flush(), которая актуализирует все операции записи на диск. При этом возможна блокировка файла на чтение.
7. Итерация
Итерация по файлу является базовой операцией и имеет множество вариантов. Использование функции read() для байтового чтения:
f = open(filename) while True: char = f.read(1) if not char: break process(char) f.close()
Построчное чтение текстовых файлов и функция readline():
f = open(filename) while True: line = f.readline() if not line: break process(line) f.close()
Файл сам может выступать в роли итератора:
for line in open(filename): process(line)
8. Pickling
Практически любой тип объекта может быть сохранен на диске в любой момент его жизни, а позже прочитан с диска. Для этого есть модуль pickle:
import pickle t1 = [1, 2, 3] s = pickle.dumps(t1) t2 = pickle.loads(s) print t2 [1, 2, 3]
Здесь есть небольшой нюанс: t1 и t2 будут двумя разными объектами, хотя и идентичными.
9. Бинарные файлы
Стандартный модуль struct позволяет преобразовывать объекты в структуры C в виде строк в бинарном формате и обратно. Данные в строке располагаются в соответствии со строкой формата. Эти возможности могут быть использованы для чтения и сохранения в двоичном формате.
Функции этого модуля:
pack(format, value1, value2 ...)
Возвращает строку, содержащую значения value1 …, упакованные в соответствии с форматом. Количество и тип аргументов должны соответствовать значениям, которые требует строка формата format.
unpack(format, string)
Распаковывает строку string в соответствии с форматом format и возвращает кортеж объектов.
calcsize(format)
Возвращает размер структуры (т.е. длину строки), соответствующей формату format.
Таблица основных форматов
=========================== Format C Type Python =========================== c char string of length 1 ? Bool bool i int integer l long integer f float float d double float s char[] string
Перед символом формата может идти число, обозначающее количество повторений. Например, строка формата ‘4h’ полностью эквивалентна строке ‘hhhh’. Символы пропуска между символами формата игнорируются, однако символы пропуска между числом и символом формата не допускаются.
Число перед символом формата ‘s’ интерпретируется как длина строки, а не число повторений. То есть ’10s’ обозначает строку из 10 символов, в то время как ’10c’ – 10 раз по одному символу.
Можно изменить порядок следования байтов вручную:
< - little-endian > - big-endian
В следующем примере мы упаковываем в структуру два числа – целое и float, строку из пяти символов, сохраняем в бинарный файл, а потом извлекаем из файла:
from struct import * out = open("123.bin", "wb") format = "if5s" data = pack(format, 24,12.48,'12345') out.write(data) out.close() input = open("123.bin", "rb") data = input.read() input.close() format = "if5s" # one integer value,value2,value3 = unpack(format, data) # note the ',' in 'value,': unpack apparently returns a n-uple print value print value2 print value3 print calcsize(format) >>> 24 >>> 12.4799995422 >>> 12345 >>> 13
10. Работа с файловой системой
import os cwd = os.getcwd() print cwd
Проверить наличие файла в текущем каталоге:
os.path.exists('my_file')
Вывести список файлов и подкаталогов для данного каталога:
os.listdir(path)
Следующий пример рекурсивно выводит список всех файлов и подкаталогов для данного каталога:
import os def walk(dir): for name in os.listdir(dir): path = os.path.join(dir, name) if os.path.isfile(path): print path else: walk(path) walk(path)
В следующем примере мы получим статистическую информацию о текущем каталоге: общий размер каталога в байтах, число файлов, число подкаталогов. Стандартная функция os.path.walk имеет три параметра: каталог, пользовательская функция, список для подсчета:
import os, sys def getlocaldata(sms,dr,flst): for f in flst: fullf = os.path.join(dr,f) if os.path.islink(fullf): continue # don't count linked files if os.path.isfile(fullf): sms[0] += os.path.getsize(fullf) sms[1] += 1 else: sms[2] += 1 def dtstat(dtroot): sums = [0,0,1] # 0 bytes, 0 files, 1 directory so far os.path.walk(dtroot,getlocaldata,sums) return sums report = dtstat('.') print report
В следующем примере сделана интерпретация системной утилиты grep. В текущем каталоге будут найдены файлы с питоновским расширением, в которых будет найдена поисковая строка ‘import os’:
import os, sys, fnmatch mask = '*.py' pattern = 'import os' def walk(arg,dir,files): for file in files: if fnmatch.fnmatch(file,mask): name = os.path.join(dir,file) try: data = open(name,'rb').read() if data.find(pattern) != -1: print name except: pass os.path.walk('.',walk,[])
Заключение
Сегодня мы узнали, что файловые объекты поддерживают чтение/запись. Для корректной работы с данными файл нужно программно закрывать. Файлы можно открывать в различных режимах. Стандартный ввод/вывод – это тоже файлы. Можно построчно читать и писать в файл. К файлам можно применять байтовую и построчную итерацию. Любые объекты могут быть сохранены на диске в произвольный момент времени в произвольном состоянии и позже восстановлены путем считывания с диска. Чтение/запись можно выполнять в бинарном режиме, соблюдая совместимость со структурами на языке си. Интерфейс с операционной системой позволяет писать компактные программы, дополняющие стандартные утилиты операционной системы.
Приведенные примеры проверены на версии питона 2.6.
< Предыдущая статья. Следующая статья >
Ресурсы для скачивания
Подпишите меня на уведомления к комментариям
www.ibm.com
запись в файл построчно и чтение — Работа с текстовыми файлами
Высокоуровневый язык программирования Python 3 предоставляет своим пользователям массу полезных средств для взаимодействия с текстовыми файлами. Встроенные методы платформы позволяют не только создавать документы для хранения строковой информации, но и читать из них данные, а также записывать, удалять и всячески манипулировать их содержимым.
Создание, открытие и закрытие файла
Работа с любым текстовым файлом в Python начинается с вызова специальной функции open, которая принимает в качестве параметров путь к объекту на компьютере и режим обработки. Путь к документу можно указать как абсолютный (адрес расположения на жестком диске ПК), так и как относительный (координаты относительно папки проекта). Выбирая нужный режим обработки файла, следует учитывать его назначение (“w” для записи, “r” для чтения данных). Следующий пример показывает простое взаимодействие с текстовым документом.
file = open("test.txt", "w") file.write("hello world") file.close()
Как можно заметить, функция open принимает относительный путь файла и открывает его для записи. Если в папке с исходным кодом документа с аналогичным именем и расширением .txt не существует, метод open создает его самостоятельно, после чего открывает для него нужный режим обработки. Выполнив все необходимые действия с переменной file, которая ссылается на реальный файл, следует вручную закрыть его, чтобы избежать потери информации. Данную задачу выполняет метод close, если вызвать его при помощи оператора доступа (точки).
Выполнить точно такие же действия, но без необходимости вручную закрывать файл, вполне возможно благодаря связке операторов with as. Для этого необходимо поместить метод open сразу после ключевого слова with, а переменную, которая будет ссылаться на файл, прописать за конструкцией as. Ниже располагается пример открытия документа с помощью with as.
with open("test.txt", "w") as file: file.write("hello world")
Оба примера небольших программ демонстрируют работу с test.txt, который генерируется в каталоге с исходным кодом. В качестве режима обработки для него выбирается запись данных. После этого при помощи метода write в него заносится строка “hello world”. Завершается код в обоих случаях закрытием текстового файла test.txt методом close или автоматически.
Запись построчно
Чтобы быстро записать информацию в текстовый файл, достаточно открыть его в программе, написанной на языке Python, после чего воспользоваться функцией write через переменную, которая ссылается на документ.
В Python запись в файл построчно осуществляется с помощью записи нужной строки с последующей записью символа перевода строки ‘\n’. Рассмотрим пример записи списка поэлементно. Каждый элемент будет записан в новой строке:
lines = ["first", "second", "third"] with open(r"D:\test.txt", "w") as file: for line in lines: file.write(line + '\n')
Приведенный выше пример небольшой программы показывает создание небольшого массива lines, который содержит три строковых элемента: “first”, “second” и “third”. За счет функции open и связки операторов with as происходит открытие текстового файла test.txt в корневом каталоге жесткого диска D. В цикле мы проходим по всем элементам списка и с помощью команды write их записываем. Чтобы каждая запись была с новой строки, добавляем символ перевода строки.
Так же можно воспользоваться функцией writelines. Если мы передадим в качестве ее параметра список, то она запишет элементы друг за другом в одну строку. Но можно поступить следующим образом: в качестве параметра передать генератор следующим образом.
lines = ["first", "second", "third"] with open(r"D:\test.txt", "w") as file: file.writelines("%s\n" % line for line in lines)
Этот пример отличается от предыдущего тем, что вызывается метод writelines, который принимает в качестве аргумента генератор. Для разделения элементов последовательности тут применяется “\n”, благодаря чему каждое слово в документе будет находиться в отдельной строке.
Чтение построчно
Прочитать содержимое текстового файла построчно в языке Python очень просто, поскольку в этом прекрасно помогает цикл for. Но для начала все же необходимо открыть документ, как и в предыдущем случае, при помощи open и with as. Однако на этот раз следует указать другой режим обработки файла, выбрав для него “r” для получения доступа к чтению данных.
with open(r"D:\test.txt", "r") as file: for line in file: print(line)
В этом примере показывается открытие файла test.txt, в котором уже содержится небольшой массив строк, записанный ранее. Построчное чтение информации из файла производится в цикле for. Каждая итерация выводит сведения из новой строки (line) при помощи функции print. Все элементы отображаются на экране построчно, как и были ранее помещены в test.txt.
Количество строк
Возможности языка Python позволяют производить и куда более сложные виды программных операций с внутренним содержимым текстовых файлов. Например, если требуется определить в Python количество строк в файле, можно открыть файл и в цикле посчитать количество занятых в нем строк. В этом поможет предварительно объявленная переменная count, в которую перед применением нужно записать 0, а затем прибавлять по единице с каждой новой строкой.
count = 0 with open(r"D:\test.txt", "r") as file: for line in file: count += 1 print(count)
Приведенный выше пример демонстрирует работу счетчика count. Для взаимодействия с ним следует открыть текстовый файл в режиме чтения, а затем инкрементировать в каждом новом шаге цикла for объявленную ранее числовую переменную, которая затем выводится в print.
Можно поступить и другим способом. Прочитать файл в список с помощью readlines. А после этого с помощью функции len определить размер списка. Это и будет количество строк.
with open(r"D:\test.txt", "r") as file: print(len(file.readlines()))
Поиск строки
Чтобы с помощью Python найти строку в текстовом файле, стоит прибегнуть к помощи встроенного метода readlines, который позволяет автоматически считывать внутреннее содержимое файла. Как и раньше, для начала необходимо открыть test.txt для чтения, чтобы затем поместить данные из него в специальный массив lines. Встроенный метод index позволяет найти номер элемента в последовательности, просто передав ему нужный объект, например, строку “second”.
with open(r"D:\test.txt", "r") as file: lines = file.readlines() print(lines.index("second\n"))
Поскольку в test.txt все элементы располагаются в отдельных строках, к строке, которую стоит передать методу index в качестве аргумента, необходимо прибавить конструкцию “\n”.
Удаление строки
Чтобы в Python удалить ненужную строку из файла, следует воспользоваться сразу двумя режимами обработки файлов: чтение и запись. Для начала необходимо открыть test.txt для чтения, чтобы поместить информацию из него в отдельный массив lines. Далее потребуется удалить один из элементов последовательности при помощи оператора del, указав ему индекс нужной строки в квадратных скобках. Массив объектов, который получился в итоге, необходимо поместить в исходный текстовый файл, однако на этот раз открыть его надо в режиме записи.
with open(r"D:\test.txt", "r") as file: lines = file.readlines() del lines[1] with open(r"D:\test.txt", "w") as file: file.writelines(lines)
Приведенный выше пример небольшой программы демонстрирует удаление строки из файла. В данном случае используются методы readlines и writelines, позволяющие считывать массив строк из документа и записывать его туда же, разделяя отдельные элементы списка.
Обратите внимание, что в приведенном примере удалится вторая строка, так как индексы списка считаются от нулевого элемента.
Таким образом, можно достаточно легко взаимодействовать с содержимым текстовых файлов, пользуясь языком программирования Python 3. Его встроенные функции позволяют записывать данные в документ и считывать их в удобном для пользователя виде. При помощи средств по расширенной работе с файлами, можно управлять ими на куда более продвинутом уровне.
all-python.ru
Python. Урок 12. Ввод-вывод данных. Работа с файлами
В уроке рассмотрены основные способы ввода и вывода данных в Python с использованием консоли, и работа с файлами: открытие, закрытие, чтение и запись.
Один из самых распространенных способов вывести данные в Python – это напечатать их в консоли. Если вы находитесь на этапе изучения языка, такой способ является основным для того, чтобы быстро просмотреть результат свой работы. Для вывода данных в консоль используется функция print.
Рассмотрим основные способы использования данной функции.
>>> print("Hello") Hello >>> print("Hello, " + "world!") Hello, world! >>> print("Age: " + str(23)) Age: 23
По умолчанию, для разделения элементов в функции print используется пробел.
>>> print("A", "B", "C") A B C
Для замены разделителя необходимо использовать параметр sep функции print.
print("A", "B", "C", sep="#") A#B#C
В качестве конечного элемента выводимой строки, используется символ перевода строки.
>>> for i in range(3): print("i: " + str(i)) i: 0 i: 1 i: 2
Для его замены используется параметр end.
>>> for i in range(3): print("[i: " + str(i) + "]", end=" -- ") [i: 0] -- [i: 1] -- [i: 2] --
Для считывания вводимых с клавиатуры данных используется функция input().
>>> input() test 'test'
Для сохранения данных в переменной используется следующий синтаксис.
>>> a = input() hello >>> print(a) hello
Если считывается с клавиатуры целое число, то строку, получаемую с помощью функции input(), можно передать сразу в функцию int().
>>> val = int(input()) 123 >>> print(val) 123 >>> type(val) <class 'int'>
Для вывода строки-приглашения, используйте ее в качестве аргумента функции input().
>>> tv = int(input("input number: ")) input number: 334 >>> print(tv) 334
Преобразование строки в список осуществляется с помощью метода split(), по умолчанию, в качестве разделителя, используется пробел.
>>> l = input().split() 1 2 3 4 5 6 7 >>> print(l) ['1', '2', '3', '4', '5', '6', '7']
Разделитель можно заменить, указав его в качестве аргумента метода split().
>>> nl = input().split("-") 1-2-3-4-5-6-7 >>> print(nl) ['1', '2', '3', '4', '5', '6', '7']
Для считывания списка чисел с одновременным приведением их к типу int можно воспользоваться вот такой конструкцией.
>>> nums = map(int, input().split()) 1 2 3 4 5 6 7 >>> print(list(nums)) [1, 2, 3, 4, 5, 6, 7]
Открытие и закрытие файла
Для открытия файла используется функция open(), которая возвращает файловый объект. Наиболее часто используемый вид данной функции выглядит так open(имя_файла, режим_доступа).
Для указания режима доступа используется следующие символы:
‘r’ – открыть файл для чтения;
‘w’ – открыть файл для записи;
‘x’ – открыть файл с целью создания, если файл существует, то вызов функции open завершится с ошибкой;
‘a’ – открыть файл для записи, при этом новые данные будут добавлены в конец файла, без удаления существующих;
‘b’ – бинарный режим;
‘t’ – текстовый режим;
‘+’ – открывает файл для обновления.
По умолчанию файл открывается на чтение в текстовом режиме.
У файлового объекта есть следующие атрибуты.
file.closed – возвращает true если файл закрыт и false в противном случае;
file.mode – возвращает режим доступа к файлу, при этом файл должен быть открыт;
file.name – имя файла.
>>> f = open("test.txt", "r") >>> print("file.closed: " + str(f.closed)) file.closed: False >>> print("file.mode: " + f.mode) file.mode: r >>> print("file.name: " + f.name) file.name: test.txt
Для закрытия файла используется метод close().
Чтение данных из файла
Чтение данных из файла осуществляется с помощью методов read(размер) и readline().
Метод read(размер) считывает из файла определенное количество символов, переданное в качестве аргумента. Если использовать этот метод без аргументов, то будет считан весь файл.
>>> f = open("test.txt", "r") >>> f.read() '1 2 3 4 5\nWork with file\n' >>> f.close()
В качестве аргумента метода можно передать количество символом, которое нужно считать.
>>> f = open("test.txt", "r") >>> f.read(5) '1 2 3' >>> f.close()
Метод readline() позволяет считать строку из открытого файла.
>>> f = open("test.txt", "r") >>> f.readline() '1 2 3 4 5\n' >>> f.close()
Построчное считывание можно организовать с помощью оператора for.
>>> f = open("test.txt", "r") >>> for line in f: ... print(line) ... 1 2 3 4 5 Work with file >>> f.close()
Запись данных в файл
Для записи данных файл используется метод write(строка), при успешной записи он вернет количество записанных символов.
>>> f = open("test.txt", "a") >>> f.write("Test string") 11 >>> f.close()
Дополнительные методы для работы с файлами
Метод tell() возвращает текущую позицию “условного курсора” в файле. Например, если вы считали пять символов, то “курсор” будет установлен в позицию 5.
>>> f = open("test.txt", "r") >>> f.read(5) '1 2 3' >>> f.tell() 5 >>> f.close()
Метод seek(позиция) выставляет позицию в файле.
>>> f = open("test.txt", "r") >>> f.tell() 0 >>> f.seek(8) 8 >>> f.read(1) '5' >>> f.tell() 9 >>> f.close()
Хорошей практикой при работе с файлами является применение оператора with. При его использовании нет необходимости закрывать файл, при завершении работы с ним, эта операция будет выполнена автоматически.
>>> with open("test.txt", "r") as f: ... for line in f: ... print(line) ... 1 2 3 4 5 Work with file Test string >>> f.closed True
P.S.
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. На нашем сайте вы можете найти вводные уроки по этой теме. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.
<<< Python. Урок 11. Работа с исключениями Python. Урок 13. Модули и пакеты >>>
devpractice.ru
Чтение и запись файлов в Python
2.2KВ этой статье мы рассмотрим операции с файлами в Python: открытие файла, чтение из файла, запись, закрытие файла. А также методы, предназначенные для работы с файлами.
Файл – это именованная область диска, предназначенная для длительного хранения данных в постоянной памяти (например, на жёстком диске).
Чтобы прочитать или записать данные в файл, сначала нужно его открыть. После окончания работы файл необходимо закрыть, чтобы освободить связанные с ним ресурсы.
Поэтому в Python операции с файлами выполняются в следующем порядке:
- Открытие файла.
- Чтение или запись (выполнение операции).
- Закрытие файла.
В Python есть встроенная функция open(), предназначенная для открытия файла. Она возвращает объект, который используется для чтения или изменения файла.
>>> f = open("test.txt") # открыть файл в текущей папке >>> f = open("C:/Python33/README.txt") # указание полного пути
При этом можно указать необходимый режим открытия файла: ‘r’- для чтения,’w’ — для записи,’a’ — для изменения. Мы также можем указать, хотим ли открыть файл в текстовом или в бинарном формате.
По умолчанию файл открывается для чтения в текстовом режиме. При чтении файла в этом режиме мы получаем строки.
В бинарном формате мы получим байты. Этот режим используется для чтения не текстовых файлов, таких как изображения или exe-файлы.
Режимы открытия файлов в Python | |
Режим | Описание |
‘r’ | Открытие файла для чтения. Режим используется по умолчанию. |
‘w’ | Открытие файла для записи. Режим создаёт новый файл, если он не существует, или стирает содержимое существующего. |
‘x’ | Открытие файла для записи. Если файл существует, операция заканчивается неудачей (исключением). |
‘a’ | Открытие файла для добавления данных в конец файла без очистки его содержимого. Этот режим создаёт новый файл, если он не существует. |
‘t’ | Открытие файла в текстовом формате. Этот режим используется по умолчанию. |
‘b’ | Открытие файла в бинарном формате. |
‘+’ | Открытие файла для обновления (чтения и записи). |
f = open("test.txt") # эквивалент 'r' или 'rt' f = open("test.txt",'w') # запись в текстовом режиме f = open("img.bmp",'r+b') # чтение и запись в бинарном формате
В отличие от других языков программирования, в Python символ ‘a’ не подразумевает число 97, если оно не закодировано в ASCII (или другой эквивалентной кодировке).
Кодировка по умолчанию зависит от платформы. В Windows – это ‘cp1252’, а в Linux ‘utf-8’.
Поэтому мы не должны полагаться на кодировку по умолчанию. При работе с файлами в текстовом формате рекомендуется указывать тип кодировки.
f = open("test.txt",mode = 'r',encoding = 'utf-8')
Закрытие освободит ресурсы, которые были связаны с файлом. Это делается с помощью метода close(), встроенного в язык программирования Python.
В Python есть сборщик мусора, предназначенный для очистки ненужных объектов, Но нельзя полагаться на него при закрытии файлов.
f = open("test.txt",encoding = 'utf-8') # выполнение операций с файлом f.close()
Этот метод не полностью безопасен. Если при операции возникает исключение, выполнение будет прервано без закрытия файла.
Более безопасный способ – использование блока try…finally.
try: f = open("test.txt",encoding = 'utf-8') # выполнение операций с файлом finally: f.close()
Это гарантирует правильное закрытие файла даже после возникновения исключения, прерывающего выполнения программы.
Также для закрытия файла можно использовать конструкцию with. Оно гарантирует, что файл будет закрыт при выходе из блока with. При этом не нужно явно вызывать метод close(). Это будет сделано автоматически.
with open("test.txt",encoding = 'utf-8') as f: # выполнение операций с файлом
Чтобы записать данные в файл в Python, нужно открыть его в режиме ‘w’, ‘a’ или ‘x’. Но будьте осторожны с режимом ‘w’. Он перезаписывает файл, если то уже существует. Все данные в этом случае стираются.
Запись строки или последовательности байтов (для бинарных файлов) осуществляется методом write(). Он возвращает количество символов, записанных в файл.
with open("test.txt",'w',encoding = 'utf-8') as f: f.write("my first filen") f.write("This filenn") f.write("contains three linesn")
Эта программа создаст новый файл ‘test.txt’. Если он существует, данные файла будут перезаписаны. При этом нужно добавлять символы новой строки самостоятельно, чтобы разделять строки.
Чтобы осуществить чтение данных из файла в Python, нужно открыть его в режиме чтения. Для этого можно использовать метод read(size), чтобы прочитать из файла данные в количестве, указанном в параметре size. Если параметр size не указан, метод читает и возвращает данные до конца файла.
>>> f = open("test.txt",'r',encoding = 'utf-8') >>> f.read(4) # чтение первых 4 символов 'This' >>> f.read(4) # чтение следующих 4 символов ' is ' >>> f.read() # чтение остальных данных до конца файла 'my first filenThis filencontains three linesn' >>> f.read() # дальнейшие попытки чтения возвращают пустую строку ''
Метод read() возвращает новые строки как ‘n’. Когда будет достигнут конец файла, при дальнейших попытках чтения мы получим пустые строки.
Чтобы изменить позицию курсора в текущем файле, используется метод seek(). Метод tell() возвращает текущую позицию курсора (в виде количества байтов).
>>> f.tell() # получаем текущую позицию курсора в файле 56 >>> f.seek(0) # возвращаем курсор в начальную позицию 0 >>> print(f.read()) # читаем весь файл This is my first file This file contains three lines
Мы можем прочитать файл построчно в цикле for.
>>> for line in f: ... print(line, end = '') ... This is my first file This file contains three lines
Извлекаемые из файла строки включают в себя символ новой строки ‘n’. Чтобы избежать вывода, используем пустой параметр end метода print(),.
Также можно использовать метод readline(), чтобы извлекать отдельные строки. Он читает файл до символа новой строки.
>>> f.readline() 'This is my first filen' >>> f.readline() 'This filen' >>> f.readline() 'contains three linesn' >>> f.readline() ''
Метод readlines() возвращает список оставшихся строк. Все эти методы чтения возвращают пустую строку, когда достигается конец файла.
>>> f.readlines() ['This is my first filen', 'This filen', 'contains three linesn']
Ниже приводится полный список методов для работы с файлами в текстовом режиме.
Методы работы с файлами в Python | |
Метод | Описание |
close() | Закрытие файла. Не делает ничего, если файл закрыт. |
detach() | Отделяет бинарный буфер от TextIOBase и возвращает его. |
fileno() | Возвращает целочисленный дескриптор файла. |
flush() | Вызывает сброс данных (запись на диск) из буфера записи файлового потока. |
isatty() | Возвращает значение True, если файловый поток интерактивный. |
read(n) | Читает максимум n символов из файла. Читает до конца файла, если значение отрицательное или None. |
readable() | Возвращает значение True, если из файлового потока можно осуществить чтение. |
readline(n=-1) | Читает и возвращает одну строку из файла. Читает максимум n байт, если указано соответствующее значение. |
readlines(n=-1) | Читает и возвращает список строк из файла. Читает максимум n байт/символов, если указано соответствующее значение. |
seek(offset,from=SEEK_SET) | Изменяет позицию курсора. |
seekable() | Возвращает значение True, если файловый поток поддерживает случайный доступ. |
tell() | Возвращает текущую позицию курсора в файле. |
truncate(size=None) | Изменяет размер файлового потока до size байт. Если значение size не указано, размер изменяется до текущего положения курсора. |
writable() | Возвращает значение True, если в файловый поток может производиться запись. |
write(s) | Записывает строки s в файл и возвращает количество записанных символов. |
writelines(lines) | Записывает список строк lines в файл. |
Данная публикация представляет собой перевод статьи «Python File IO Read and Write Files in Python» , подготовленной дружной командой проекта Интернет-технологии.ру
www.internet-technologies.ru
Работа с файлами в питон
В этом уроке мы разберём, как читать файлы и писать в файлах в Питоне. В файлы записываются результаты работы программы, которые можно потом использовать в других приложениях. Поэтому необходимо уметь в Питон записывать информацию в файлыТакже в файлах может храниться большой объем входной информации, которую должна обработать программа. Поэтому необходимо уметь считывать информацию из файлов в python.
Чтобы начать работу с файлом в Питон, нужно открыть файл. Открыть файл в Питон можно, прописав команду
with open(“file.ext”, mode) as name: имя перменной файла
with, open и as это ключевые слова. Команда open() открывает файл с именем “file” с разрешением файла “ext”. Параметр mode отвечает за режим открытия файла. Необходимо указать полный путь к файлу, причем используются слеши Например, можно открыть файл только для считывания информации из файла, можно открыть файл для добавления в него информации, можно просто создать новый файл с заданным именем. Название и расширение файла пишется в кавычках, расширение файла пишется после названия файла через точку, режим открытия пишется в кавычках. В таблице ниже приведены некоторые режимы открытия файла в Питон.
Чтение из файла в Python
Разберём режим чтения файла “r”. Создайте новую программу в Spyder, сохраните её на Рабочем столе. Там же создайте текстовый документ text с расширением txt. Внутри напишите следующий текст.
1) Привет! Я первая строка.
2) Вторая строка.
3) Третья строка.
Чтобы вывести в программе Питон в консоль весь файл, используйте команду f.read().
Пример. Программа python читает весь файл и выводит его в консоль.
with open(«text.txt», «r») as f:
text = f.read()
print(text)
Команда f.read(n) может принимать аргумент n, n это количество знаков с начала, которое будет считываться из файла. Например, если будет исполняться команда f.read(50), то программа выведет 50 знаков с начала файла.
Пример. Программа в Python для считывания опредленного количества знаков
with open(«text.txt», «r») as f:
text = f.read(50)
print(text)
Если вы хотите читать текст не с начала файла, а с какого-либо символа, используйте команду f.seek(n), n это символ, с которого начнётся чтение файла. Файл начинается с нулевого символа.
Пример. Программа на Python для чтение файла с начала второй строки.
with open(«text.txt», «r») as f:
f.seek(27)
text = f.read(50)
print(text)
Python позволяет считать все строки текста файла в отдельный массив с помощью команды f.readlines()
Пример. Программа python выводит в консоль третью строку файла.
with open(«text.txt», «r») as f:
text = f.readlines()
print(text[2])
Если вы хотите считывать все строки по отдельности, не записывая их в массив, используется команда f.readline() Команда будет считывать одну строку из файла. Если использовать эту команду несколько раз, то они будут выводить разные строки. Например, если вы написали две команды f.readline(), то первая команда выведет первую строку, вторая команда выведет вторую строку.
Пример программы python считывание строк из файла с помощью команды f.readline().
with open(«text.txt», «r») as f:
text = f.readline()
print(text)
print(f.readline())
Часто отдельные части данных разделены каким-либо знаком. Python заменять эти знаки из строк с помощью команды f.replace(start, final), где start это знак, который надо заменить, final это знак, на который надо заменить.
Пример программы, заменяющей все пробелы в строке на знак +.
string = «Всем привет! Я строка.»
print(string.replace(» «, «+»))
Запись данных в файл в python
Разберём режим добавления информации в файл в Питон “w” Для добавления информации в файл в python используется команда f.write(“text”) Эта команда удаляет весь старый текст в файле и вместо него пишет новый. Чтобы это увидеть, перед запуском программы с этой командой посмотрите в файл text.txt, там должны быть строки текста. После исполнения программы с этой командой зайдите в тот же файл, там не должно быть старых строк, вместо них будет текст, который вы написали в команде.
Пример программа на Python запись текста в файл с использованием команды f.write().
with open(«text.txt», «w») as f:
f.write(«Текст.»)
Вместо этого текста
1) Привет! Я первая строка.
2) Вторая строка.
3) Третья строка.
Должна появиться эта строка
Текст.
Чтобы написать несколько строк, используйте команду f.writelines(line), где line это массив со строками, которые нужно напечатать.
Пример. Программа нв Python для записи массива строк в файл
with open(«text.txt», «w») as f:
f.writelines([«Первый элемент. «, «Вторая строка.»])
Разберём режим добавления информации “a”. Этот режим отличается от “w” тем, что он не удаляет старую информацию, когда пишет, в отличии от “w”. Все команды в режиме “a” идентичны командам в режиме “w”, но в режиме “a” команды не удаляют старый текст, а пишут новый в конце файла.
Разберём большой пример работы с файлами в Python. Дан текстовый файл data с двумя столбцами и десятью строками однозначных или двузначных чисел. Числа разделены пробелом. Для каждой строки нужно найти среднее этих чисел и вывести их в новый текстовый файл result.
Файл data.
11 47
59 15
2 52
64 48
58 88
59 86
37 39
19 92
48 85
16 78
Введём массив для обычных строк line[], массив для строк без пробелов aC[], массив для чисел в каждом столбце a1[] и a2[] и массив res[], в котором будут находиться средние значения.
Откроем файл data.txt и считаем из него числа. Введём цикл for на 10 итераций (повторений) по количеству строк. Считаем строку под номером i с помощью команды f.readline() и запишем её в массив с индексом i line[i].
line[i] = f.readline()
Чтобы удалить пробелы между числами, используем команду line[i].replace(“ ”, “”), при её исполнении все пробелы в строке под номером i заменятся на пустую строку. Чтобы оперировать с получившимися числами, нужно перевести их из строк в числа, для этого используется int(aC[i]). У нас получаются трёх- или четырёхзначные числа. Чтобы отделить первое число от второго, нужно использовать целочисленное деление. В целых числах разделим каждый элемент массив aC[] на 100, чтобы отбросить часть числа до сотых.
a1[i] = aC[i] // 100
Например, у нас есть число 1147, это комбинация чисел 11 и 47. Если это число мы разделим на 100, то целая часть результата будет равна 11, а остаток будет равен 47. Деление в целых числах отбрасывает остаток, оставляя только целую часть. Таким образом, мы получим первое число. Второе число будет равно остатку от деления на 100.
a2[i] = aC[i] % 100
Мы получили два числа от каждой строки. Теперь нужно найти их среднее арифметическое. Все средние значения мы запишем в массив res[i].
for i in range(10):
res[i] = (a1[i] + a2[i]) / 2
Чтобы записать все результаты в новый файл, откроем файл result.txt в режиме “a”. С помощью цикла for запишем все результаты в отдельные строки.
with open(«result.txt», «a») as result:
for i in range(10):
res[i] = str(res[i])
result.write(res[i] + » «)
Полный код программы python считывание числовых столбцов из файла и запись в файл столбца средних значений
# вводим массивы
line = {} # строки
aC = {} # строки без пробелов
a1 = {} # первое число
a2 = {} # второе число
res = {} # результат — среднее арифметическое
# выводится в новый файл
with open(«data.txt», «r») as f:
for i in range(10):
line[i] = f.readline()
aC[i] = line[i].replace(» «, «»)
aC[i] = int(aC[i])
a1[i] = aC[i] // 100
a2[i] = aC[i] % 100
for i in range(10):
res[i] = (a1[i] + a2[i]) / 2
print(res[i])
with open(«result.txt», «a») as result:
for i in range(10):
res[i] = str(res[i])
result.write(res[i] + » «)
Вернуться к содержанию Следующая тема Библиотека NumPy в Python матрицы в питон
Поделиться:
itrobo.ru
Python | Работа с файлами
Открытие и закрытие файлов
Последнее обновление: 29.04.2017
Python поддерживает множество различных типов файлов, но условно их можно разделить на два виде: текстовые и бинарные. Текстовые файлы — это к примеру файлы с расширением cvs, txt, html, в общем любые файлы, которые сохраняют информацию в текстовом виде. Бинарные файлы — это изображения, аудио и видеофайлы и т.д. В зависимости от типа файла работа с ним может немного отличаться.
При работе с файлами необходимо соблюдать некоторую последовательность операций:
Открытие файла с помощью метода open()
Чтение файла с помощью метода read() или запись в файл посредством метода write()
Закрытие файла методом close()
Открытие и закрытие файла
Чтобы начать работу с файлом, его надо открыть с помощью функции open(), которая имеет следующее формальное определение:
open(file, mode)
Первый параметр функции представляет путь к файлу. Путь файла может быть абсолютным, то есть начинаться с буквы диска, например, C://somedir/somefile.txt. Либо можно быть относительным, например, somedir/somefile.txt — в этом случае поиск файла будет идти относительно расположения запущенного скрипта Python.
Второй передаваемый аргумент — mode
устанавливает режим открытия файла в зависимости от того, что мы собираемся с ним делать.
Существует 4 общих режима:
r (Read). Файл открывается для чтения. Если файл не найден, то генерируется исключение FileNotFoundError
w (Write). Файл открывается для записи. Если файл отсутствует, то он создается. Если подобный файл уже есть, то он создается заново, и соответственно старые данные в нем стираются.
a (Append). Файл открывается для дозаписи. Если файл отсутствует, то он создается. Если подобный файл уже есть, то данные записываются в его конец.
b (Binary). Используется для работы с бинарными файлами. Применяется вместе с другими режимами — w или r.
После завершения работы с файлом его обязательно нужно закрыть методом close()
. Данный метод освободит все связанные с файлом используемые ресурсы.
Например, откроем для записи текстовый файл «hello.txt»:
myfile = open("hello.txt", "w") myfile.close()
При открытии файла или в процессе работы с ним мы можем столкнуться с различными исключениями, например, к нему нет доступа и т.д. В этом случае программа выпадет в ошибку, а ее выполнение не дойдет до вызова метода close, и соответственно файл не будет закрыт.
В этом случае мы можем обрабатывать исключения:
try: somefile = open("hello.txt", "w") try: somefile.write("hello world") except Exception as e: print(e) finally: somefile.close() except Exception as ex: print(ex)
В данном случае вся работа с файлом идет во вложенном блоке try. И если вдруг возникнет какое-либо исключение, то в любом случае в блоке finally файл будет закрыт.
Однако есть и более удобная конструкция — конструкция with:
with open(file, mode) as file_obj: инструкции
Эта конструкция определяет для открытого файла переменную file_obj и выполняет набор инструкций. После их выполнения файл автоматически закрывается. Даже если при выполнении инструкций в блоке with возникнут какие-либо исключения, то файл все равно закрывается.
Так, перепишем предыдущий пример:
with open("hello.txt", "w") as somefile: somefile.write("hello world")
metanit.com
Python. Работа с файлами
Для того, чтобы открыть файл, в Python предусмотрена команда «open». Она может открывать как бинарные, так и текстовые файлы. У нее два параметра: имя файла и режим открытия. Например:
f = open(‘text.txt’, ‘r’)
f = open(‘text.txt’, ‘r’) |
откроет файл с именем “text.txt” для чтения.
Существуют следующие режимы открытия файла:
· На чтение “r”
· На запись “w”. Если файл существует, он будет перезаписан.
· На запись нового файла “x”. Если файл уже есть, выскочит исключение.
· На дозапись “a”. Информация будет добавлена в конец файла.
· В двоичном режиме “b”.
· В текстовом режиме “t”.
· На чтение и запись “+”.
Режимы можно комбинировать, например, если вы хотите открыть бинарник на чтение, то нужно использовать “rb”. Если вы хотите открыть текстовый файл, то “t” можно опустить, это является режимом по умолчанию.
Примеры работы с текстовым файлом вы можете посмотреть в цикле уроков «Взлом шифров»:
· http://wiki.programstore.ru/python-vzlom-shifrov/
· http://wiki.programstore.ru/python-vzlom-shifrov-prodolzhenie/
· http://wiki.programstore.ru/python-vzlom-shifrov-prodolzhenie-2/
Теперь разберем еще примеры.
Чтение списка файлов из каталога с заданными расширениями и поиск в них заданной строки:
#Подключаем модуль import os #Каталог из которого будем брать файлы directory = ‘d:\\1’ #Получаем список файлов в переменную files files = os.listdir(directory) #Задаем строку поиска search_str=»body» for file in files: filename, file_extension = os.path.splitext(file) s=file_extension.lower() if s==».txt» or s==».html» or s==».htm»: f = open(directory+»\\»+file) for line in f: if line.find(search_str)>-1: print(«В файле «+file+» найдена строка «+search_str) break
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#Подключаем модуль import os
#Каталог из которого будем брать файлы directory = ‘d:\\1’
#Получаем список файлов в переменную files files = os.listdir(directory)
#Задаем строку поиска search_str=»body»
for file in files: filename, file_extension = os.path.splitext(file) s=file_extension.lower() if s==».txt» or s==».html» or s==».htm»: f = open(directory+»\\»+file) for line in f: if line.find(search_str)>-1: print(«В файле «+file+» найдена строка «+search_str) break |
Здесь для чтения списка файлов в каталоге используем модуль «os», его же и для распарсивания имени файла на расширение и собственно имя. Результат работ что-то вроде того:
В файле 1.html найдена строка body
Теперь попробуем сохранить в файле данные в json-формате:
import json numbers = [2, 3, 5, 7, 11, 13] filename = ‘numbers1.json’ with open(filename, ‘w’) as f_obj: json.dump(numbers, f_obj)
import json numbers = [2, 3, 5, 7, 11, 13] filename = ‘numbers1.json’ with open(filename, ‘w’) as f_obj: json.dump(numbers, f_obj) |
Как прочитать? Вот так:
import json filename = ‘numbers.json’ with open(filename) as f_obj: numbers=json.load(f_obj) print(numbers)
import json filename = ‘numbers.json’ with open(filename) as f_obj: numbers=json.load(f_obj)
print(numbers) |
Если открыть этот файл, то мы увидим нечто вот такое:
[2, 3, 5, 7, 11, 13]
А если попробовать записать более сложную структуру:
import json numbers = [2, 3, 5, 7, 11, 13] dic1={«proba1″:1,»probs2″:2,»proba3»:{«proba4″:(1,2),»proba5″:5},»proba6»:4} dic={«numbers»:numbers,»proba»:1,»dictionary»:dic1} filename = ‘numbers2.json’ with open(filename, ‘w’) as f_obj: json.dump(dic, f_obj)
import json numbers = [2, 3, 5, 7, 11, 13] dic1={«proba1″:1,»probs2″:2,»proba3»:{«proba4″:(1,2),»proba5″:5},»proba6»:4} dic={«numbers»:numbers,»proba»:1,»dictionary»:dic1} filename = ‘numbers2.json’ with open(filename, ‘w’) as f_obj: json.dump(dic, f_obj) |
То и сам получены файл будет больше похож на истинный JSON:
{«numbers»: [2, 3, 5, 7, 11, 13], «proba»: 1, «dictionary»: {«proba1»: 1, «probs2»: 2, «proba3»: {«proba4»: [1, 2], «proba5»: 5}, «proba6»: 4}}
Ну и напоследок, сериализация в бинарные файлы:
import pickle numbers = [2, 3, 5, 7, 11, 13] dic1={«proba1″:1,»probs2″:2,»proba3»:{«proba4″:(1,2),»proba5″:5},»proba6»:4} dic={«numbers»:numbers,»proba»:1,»dictionary»:dic1} filename = ‘pickle.dat’ with open(filename, ‘wb’) as f_obj: pickle.dump(dic, f_obj)
import pickle numbers = [2, 3, 5, 7, 11, 13] dic1={«proba1″:1,»probs2″:2,»proba3»:{«proba4″:(1,2),»proba5″:5},»proba6»:4} dic={«numbers»:numbers,»proba»:1,»dictionary»:dic1} filename = ‘pickle.dat’ with open(filename, ‘wb’) as f_obj: pickle.dump(dic, f_obj) |
А прочитать можно вот так:
import pickle filename = ‘pickle.dat’ with open(filename, ‘rb’) as f_obj: dic=pickle.load(f_obj) print(dic)
import pickle filename = ‘pickle.dat’ with open(filename, ‘rb’) as f_obj: dic=pickle.load(f_obj) print(dic) |
wiki.programstore.ru