Как делать подключаемые файлы в питон. Запись данных в файл. Расширенная работа с файлами в Python

Python поддерживает множество различных типов файлов, но условно их можно разделить на два виде: текстовые и бинарные. Текстовые файлы - это к примеру файлы с расширением cvs, txt, html, в общем любые файлы, которые сохраняют информацию в текстовом виде. Бинарные файлы - это изображения, аудио и видеофайлы и т.д. В зависимости от типа файла работа с ним может немного отличаться.

Лучший способ управления ресурсами

Конечно, есть простой способ получить программу: закройте каждый файл! Вот примерный способ устранения проблемы. И это тоже не считается исключением. Короткий ответ: вы не можете быть. В настоящее время предпосылка должна быть очевидной. Нам нужен удобный способ указания конкретной переменной, связанной с ней, и гарантировать, что очистка произойдет, несмотря ни на что. Учитывая это требование, синтаксис использования контекстных менеджеров имеет большой смысл.

Добавление в файл. Метод write()

Подумайте о том, как создать мини-функцию: мы можем свободно использовать переменную в отступом, но как только этот блок заканчивается, переменная выходит за рамки. Когда переменная выходит за пределы области действия, она автоматически вызывает специальный метод, который содержит код для очистки ресурса. Но где код, который фактически вызывается, когда переменная выходит за пределы области видимости? Короткий ответ: «везде, где определен менеджер контекста». Понимаете, существует несколько способов создания менеджера контекста.

При работе с файлами необходимо соблюдать некоторую последовательность операций:

    Открытие файла с помощью метода 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). Файл открывается для дозаписи. Если файл отсутствует, то он создается. Если подобный файл уже есть, то данные записываются в его конец.

    Запись данных в файл Python

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

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

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

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

Печать - это команда, которая печатает объекты в текстовой форме. Вы будете использовать печать, как это, в тех случаях, когда вы хотите создать информацию, которая должна быть немедленно устранена. Иногда, однако, вы будете создавать информацию, которую хотите сохранить, отправить кому-то другому или использовать в качестве входных данных для дальнейшей обработки другой программой или набором программ. В этих случаях вам нужно отправить информацию в файлы на вашем жестком диске, а не в панель «Выход команды».

Сегодня мы рассмотрим следующие темы.

  1. Как открыть файл.
  2. Базовые файловые методы.
  3. Стандартный ввод/вывод.
  4. Произвольный доступ.
  5. Построчная работа с файлами.
  6. Закрытие файла.
  7. Итерация.
  8. Pickling.
  9. Бинарные файлы – модуль struct.
  10. Работа с файловой системой.

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) – это конструкция, объединяющая стандартный вывод со стандартным вводом и позволяющая обмениваться данными между двумя командами.

Чтение файлов классно и все, но писать в файлы намного веселее. Это также должно внушить чувство опасности в вас, потому что вы можете перезаписать контент и потерять все за мгновение. Несмотря на угрозу опасности, мы продолжаем. Имея несколько схожие методы чтения, у письменности есть в основном 2 метода написания. Теперь, когда мы обнародовали наш файл, давайте попробуем его перестроить. Если вы продолжаете из последнего урока, мы просто переписали содержимое, которое мы удалили в файл. Тем не менее, вы можете перекинуть крик, «но это не то же самое!» Вы на 100% верны моему другу.

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. Построчная работа с файлами

Обычно мы имеем дело с текстовыми файлами. Прочитать одну строку:

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

file.readlines()

Записать строки в файл:

f = open(r"my_file") lines = f.readlines() f.close() lines = "This is a my_file2 \n" # изменяем 1-ю строку f = open(r"my_file2","w") f.writelines(lines) f.close()

6. Закрытие файла

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

  1. Питон может буферизировать запись в файл ваших данных, что может привести к неожиданным эффектам и возникновению ошибок.
  2. У операционной системы есть ограничение на число одновременно открытых файлов.
  3. При доступе к файлу из разных мест одновременно и на чтение, и на запись необходимо синхронизировать файловые операции. Буферизация записи может привести к тому, что запись уже произошла, а данных в файле еще нет.

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

Файл сам может выступать в роли итератора:

8. Pickling

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

import pickle t1 = s = pickle.dumps(t1) t2 = pickle.loads(s) print t2

Здесь есть небольшой нюанс: 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. Работа с файловой системой

Стандартный модуль os имеет интерфейс работы с файловой системой. Каждая программа имеет текущий каталог. Функция os.getcwd возвращает текущий каталог:

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 += os.path.getsize(fullf) sms += 1 else: sms += 1 def dtstat(dtroot): sums = # 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.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: