Python не сохраняет файлы
Как сохранить данные в Python?
Когда мы работаем над приложениями Python, мы будем иметь дело с объектами Python напрямую, так как все является объектом в Python. Давайте посмотрим на некоторые способы, которыми мы можем легко хранить их!
1. Использование сочинения для хранения объектов Python
Если мы хотим держать вещи простыми, мы можем использовать модуль сортировки, который является частью стандартной библиотеки для сохранения данных в Python.
Мы можем «сортировать» объекты Python в пиловый файл, который мы можем использовать для сохранения данных/загрузки данных.
Поэтому, если у вас есть пользовательский объект, который вам может потребоваться хранить/извлекать, вы можете использовать этот формат:
Если вы запускаете этот скрипт, вы заметите файл под названием data.pickle , который содержит сохраненные данные.
Чтобы снова загрузить один и тот же объект, мы могли бы использовать Pickle.Load () используя аналогичную логику.
Мы только что успешно восстановили наши старые данные!
2. Использование SQLite3 для постоянного сохранения данных в Python
Если вы хотите использовать постоянную базу данных для сохранения данных в Python, вы можете использовать SQLite3 Библиотека, которая предоставляет вам API для использования баз данных SQLite.
Опять же, это часть стандартной библиотеки, поэтому нет необходимости устанавливать ничего!
Однако, поскольку это реляционная база данных, вы не можете напрямую давить объекты Python, как в Парил Отказ
Вам придется сериализовать и десериализировать их в соответствующие типы баз данных.
Посмотрите на некоторые примеры, вы можете обратиться к этой статье на использовании SQLite в Python.
3. Использование SQLICENCT в качестве постоянного кэша
Если вы найдете использование SQLite3 Слишком утомительно, есть гораздо лучшее решение! Вы можете использовать sqlized Для хранения постоянных данных, и это внутренне использует SQLite3 база данных для обработки хранилища.
Вы должны установить этот пакет, используя PIP:
Единственное, что вы должны иметь в виду, это то, что вам нужно использовать Ключ: значение отображения для хранения/извлечения данных, как и словарь!
Вот очень простой пример, используя MyClass пример.
Действительно, мы просто загрузили наш объект Python! Если вы заметите, sqlized создаст базу данных cache.sqlite3 автоматически, если оно не существует, а затем используйте его для хранения/загрузки данных.
Заключение
В этой статье мы смотрели, как мы можем использовать Python для хранения данных по-разному.
Эта статья посвящена работе с файлами (вводу/выводу) в Python: открытие, чтение, запись, закрытие и другие операции.
Файлы Python
Файл — это всего лишь набор данных, сохраненный в виде последовательности битов на компьютере. Информация хранится в куче данных (структура данных) и имеет название «имя файла» (filename).
В Python существует два типа файлов:
Текстовые файлы
Это файлы с человекочитаемым содержимым. В них хранятся последовательности символов, которые понимает человек. Блокнот и другие стандартные редакторы умеют читать и редактировать этот тип файлов.
Текст может храниться в двух форматах: ( .txt ) — простой текст и ( .rtf ) — «формат обогащенного текста».
Бинарные файлы
В бинарных файлах данные отображаются в закодированной форме (с использованием только нулей (0) и единиц (1) вместо простых символов). В большинстве случаев это просто последовательности битов.
Они хранятся в формате .bin .
Любую операцию с файлом можно разбить на три крупных этапа:
- Открытие файла
- Выполнение операции (запись, чтение)
- Закрытие файла
Открытие файла
Метод open()
В Python есть встроенная функция open() . С ее помощью можно открыть любой файл на компьютере. Технически Python создает на его основе объект.
- file_name = имя открываемого файла
- access_mode = режим открытия файла. Он может быть: для чтения, записи и т. д. По умолчанию используется режим чтения ( r ), если другое не указано. Далее полный список режимов открытия файла
Пример
Создадим текстовый файл example.txt и сохраним его в рабочей директории.
Следующий код используется для его открытия.
В этом примере f — переменная-указатель на файл example.txt .
Следующий код используется для вывода содержимого файла и информации о нем.
Стоит обратить внимание, что в Windows стандартной кодировкой является cp1252 , а в Linux — utf-08 .
Закрытие файла
Метод close()
После открытия файла в Python его нужно закрыть. Таким образом освобождаются ресурсы и убирается мусор. Python автоматически закрывает файл, когда объект присваивается другому файлу.
Существуют следующие способы:
Способ №1
Проще всего после открытия файла закрыть его, используя метод close() .
После закрытия этот файл нельзя будет использовать до тех пор, пока заново его не открыть.
Способ №2
Также можно написать try/finally , которое гарантирует, что если после открытия файла операции с ним приводят к исключениям, он закроется автоматически.
Без него программа завершается некорректно.
Вот как сделать это исключение:
Файл нужно открыть до инструкции try , потому что если инструкция open сама по себе вызовет ошибку, то файл не будет открываться для последующего закрытия.
Этот метод гарантирует, что если операции над файлом вызовут исключения, то он закроется до того как программа остановится.
Способ №3
Инструкция with
Еще один подход — использовать инструкцию with , которая упрощает обработку исключений с помощью инкапсуляции начальных операций, а также задач по закрытию и очистке.
В таком случае инструкция close не нужна, потому что with автоматически закроет файл.
Вот как это реализовать в коде.
Чтение и запись файлов в Python
В Python файлы можно читать или записывать информацию в них с помощью соответствующих режимов.
Функция read()
Функция read() используется для чтения содержимого файла после открытия его в режиме чтения ( r ).
Синтаксис
- file = объект файла
- size = количество символов, которые нужно прочитать. Если не указать, то файл прочитается целиком.
Пример
Функция readline()
Функция readline() используется для построчного чтения содержимого файла. Она используется для крупных файлов. С ее помощью можно получать доступ к любой строке в любой момент.
Пример
Создадим файл test.txt с нескольким строками:
Посмотрим, как функция readline() работает в test.txt .
Обратите внимание, как в последнем случае строки отделены друг от друга.
Функция write()
Функция write() используется для записи в файлы Python, открытые в режиме записи.
Если пытаться открыть файл, которого не существует, в этом режиме, тогда будет создан новый.
Синтаксис
Пример
Предположим, файла xyz.txt не существует. Он будет создан при попытке открыть его в режиме чтения.
Переименование файлов в Python
Функция rename()
Функция rename() используется для переименовывания файлов в Python. Для ее использования сперва нужно импортировать модуль os.
- src = файл, который нужно переименовать
- dest = новое имя файла
Пример
Текущая позиция в файлах Python
В Python возможно узнать текущую позицию в файле с помощью функции tell() . Таким же образом можно изменить текущую позицию командой seek() .
Разрабатывая приложения вам придется работать с файлами, анализировать большие объемы данных, сохранять пользовательские данные, чтобы они не терялись по завершению работы программы. Также при работе с файлами важно научиться обрабатывать ошибки, чтобы они не привели к аварийному завершению программы. Для этого в Python существуют специальные объекты - исключения, которые создаются для управления ошибок.
1. Чтение файла в Python
3.1415926535
В случае, если файл расположен не в одном каталоге с файлом программы, необходимо указать путь, чтобы Python искал файлы в конкретном месте. Существует два пути как прописать расположение файла:
Относительный путь.
Относительный путь приказывает Python искать файлы в каталоге, который задается относительно каталога, в котором находится текущий файл программы
Абсолютный путь.
Местонахождение файла не зависит от того, где находится ваша программа. Абсолютные пути обычно длиннее относительных, поэтому их лучше сохранить в переменную и затем передать функции open() .
С абсолютными путями можно читать файлы из любого каталога вашей системы.
1.2. Чтение больших файлов на Python и работа с ними
Выведем на экран первые 100 знаков после запятой. Добавим в конец функцию len, чтобы узнать длину файла
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
1000002
Из выходных данных видно, что строка содержит значение "Пи" с точностью до 1 000 000 знаков после запятой. В Python нет никаких ограничений на длину данных, с которыми можно работать, единственное ограничение это объем памяти вашей системы.
После сохранения данных в переменной можно делать с ними все что угодно. Давайте проверим, входит ли в число "Пи" дата вашего дня рождения. Напишем небольшую программу, которая будет читать файл и проверять входит ли дата день рождения в первый миллион числа "Пи":
Начало программы не изменилось, читаем файл и сохраняем данные в переменной digits. Далее запрашиваем данные от пользователя с помощью функции input и сохраняем в переменную birstday. Затем проверяем вхождение birstday в digits с помощью команды if-else. Запустив несколько раз программу, получим результат:
В зависимости от введенных данных мы получили результат вхождения или не вхождения дня рождения в число "Пи"
Важно: Читая данные из текстового файла, Python интерпретирует весь текст как строку. Если вы хотите работать с ним в числовом контексте, то преобразуйте данные в целое число функцией int() или в вещественное число функцией float().
1.3. Анализ текста из файла на Python
Для подсчета вхождения слова или выражений в строке можно воспользоваться методом count() , но прежде привести все слова к нижнему регистру функцией lower() . Количество вхождений сохраним в переменной n_alice.
Чтобы подсчитать количество слов в тексе, воспользуемся методом split() , предназначенный для построения списка слов на основе строки. Метод split() разделяет строку на части, где обнаружит пробел и сохраняет все части строки в элементах списка. Пример метода split() :
После использования метода split() , сохраним список в переменной words и далее подсчитаем количество слов в списке, с помощью функции len() . После подсчета всех данных, выведем на экран результат:
2.1. Запись в пустой файл в Python
Язык программирования Python
Получившийся файл ничем не отличается от любых других текстовых файлах на компьютере, с ним можно делать все что угодно.
Файлы можно открывать в режимах:
2.2. Многострочная запись в файл на Python
При использовании функции write() символы новой строки не добавляются в записываемый файл:
В результате открыв файл мы увидим что все строки склеились:
Язык программирования PythonЯзык программирования JavaЯзык программирования Perl
Результат будет выглядеть так:
Язык программирования Python
Язык программирования Java
Язык программирования Perl
2.3. Присоединение данных к файлу на Python
В результате к нашему файлу добавятся две строки:
Язык программирования Python
Язык программирования Java
Язык программирования Perl
Hello world
Полет на луну
3. Исключения в Python
При выполнении программ могут возникать ошибки, для управления ими Python использует специальные объекты, называемые исключениями. Когда в программу включен код обработки исключения, ваша программа продолжится, а если нет, то программа остановится и выведет трассировку с отчетом об исключении. Исключения обрабатываются в блоках try-except . С блоками try-except программы будут работать даже в том случае, если что-то пошло не так.
3.1. Блоки try-except на Python
Приведем пример простой ошибки деления на ноль:
Traceback (most recent call last):
File "example.py", line 1, in <module>
print(7/0)
ZeroDivisionError: division by zero
Если в вашей программе возможно появление ошибки, то вы можете заранее написать блок try-except для обработки данного исключения. Приведем пример обработки ошибки ZeroDivisionError с помощью блока try-except :
try :
print(7/0)
except ZeroDivisionError:
print("Деление на ноль запрещено")
Деление на ноль запрещено
Если за кодом try-except следует другой код, то Python продолжит выполнение программы.
3.2. Блок try-except-else на Python
Напишем простой калькулятор, который запрашивает данные у пользователя, а затем результат деления выводит на экран. Сразу заключим возможную ошибку деления на ноль ZeroDivisionError и добавим блок else при успешном выполнение блока try .
Введите первое число: 30
Введите второе число: 5
Частное двух чисел равно 6.0
Введите первое число: 7
Введите второе число: 0
Деление на ноль запрещено
Введите первое число: q
В результате действие программы при появлении ошибки не прервалось.
3.3. Блок try-except с текстовыми файлами на Python
Одна из стандартных проблем при работе с файлами, это отсутствие необходимого файла, или файл находится в другом месте и Python не может его найти. Попробуем прочитать не существующий файл:
Так как такого файла не существует, Python выдает исключение:
FileNotFoundError - это ошибка отсутствия запрашиваемого файла. С помощью блока try-except обработаем ее:
В результате при отсутствии файла мы получим:
Запрашиваемый файл alice_2.txt не найден
3.4. Ошибки без уведомления пользователя
В предыдущих примерах мы сообщали пользователю об ошибках. В Python есть возможность обработать ошибку и не сообщать пользователю о ней и продолжить выполнение программы дальше. Для этого блок try пишется, как и обычно, а в блоке except вы прописываете Python не предпринимать никаких действий с помощью команды pass . Приведем пример ошибки без уведомления:
В результате при запуске этой программы и отсутствия запрашиваемого файла ничего не произойдет.
В данном посте хотелось бы предложить написать небольшое приложение, использующее графический интерфейс. Задача выбора подходящего инструмента для осуществления этой задумки может оказаться достаточно нетривиальной. Python поддерживает несколько графических библиотек:
- wxWidgest и интерфейс к этой библиотеке — wxPython. Наилучший выбор, если вы хотите, чтобы ваши приложения выглядели в любой ОС с любым графическим интерфейсом как родные. Самый большой минус на момент написания поста — недостаточно широкая документация. Впрочем, кто-то может с этим не согласиться.
- tkinter — Tk — самая простая и распространённая библиотека. Используется очень широко. Документация подробна и содержит всё необходимое для быстрого начала работы.
-PyQt — интерфейс к библиотеке Qt . Эта библиотека также переносима на Linux, Windows и MacOS. Хотя стоит отметить, что интерфейс программы, естественно, будет отличаться от "родных" приложений и только в случае со связкой Linux+KDE будет выглядеть как влитой. Тем не менее используется очень широко. Документация отличная. В написании кода, пожалуй, наиболее сложен.
PyGTK — как и предыдущий привязан к своей оконной системе. Не так распространён как три библиотеки, данные выше.
Разумеется, графических библиотек намного больше. Указанные здесь — основные. Автором рекомендуется выбирать между wxPython и Tkinter . Дабы использовать какую-либо библиотеку, нужно её установить (исключением является разве что OS Windows, где python, похоже, поставляется в чуть ли не полной комплектации). Разбираемый сегодня пример будет задействовать библиотеку tkinter и потребует установки модуля tk . Пользователи Linux могут найти его с помощью своего пакетного менеджера или собрать python с ключом tk (для gentoo).
Как это работает?
tkinter — программный слой поверх Tk , позволяющий сценариям на языке Python обращаться к библиотеке Tk , конструирующей и настраивающей интерфейсы и возвращающей управление обратно в сценарии Python, которые обрабатывают события, генерируемые пользователем (например, щелчки мышью). Таким образом, обращения к графическому интерфейсу из сценария Python направляются в tkinter, а затем в Tk; события, возникающие в графическом интерфейсе, направляются из Tk в tkinter, а затем обратно в сценарий Python.
Начали импорт
модуль os представляет переносимый интерфейс к часто используемым службам операционной системы. Нами будет использован для указания пути ( os.path );
shutil используется для таких операций над файлами как копирование, переименование, удаление;
Функция выбора директории для копирования, получение доступа к описанию функции.
Прежде всего, никогда не стоит забывать документировать ваш код хотя бы для того, чтобы спустя некоторое время вы сами могли в нём разобраться. В примере сразу ниже функции даётся её краткое описание.
При импорте модуля можно будет обратиться к ней, вызвав команду backup.savefiles.__doc__ — то есть имя_модуля.имя_функции.__описание__ :
Полученный нами в итоге модуль не предназначен для расширения или импортирования, тем не менее строки документации создавать всё же нужно.
Далее используется переменная dst, которая впоследствии примет значение указанной пользователем директории. Значение будет строковым. Здесь переменная сделана глобальной поскольку должна быть доступна и другим функциям.
dst = askdirectory() - запросит у пользователя выбор директории для сохранения файлов
print (type(dst)) и print(dst) будут выводить в консоли информацию для нас, дабы мы могли увидеть какой тип получился у переменной, когда пользователь выбрал директорию. Можно удалить строки с print .
Функция выбора файлов для бекапа и вложенная функция копирования выбранных файлов
askopenfilenames - выбрать файлы для копирования. Поскольку в итоге мы получим кортеж, а кортежи неизменяемы, сразу же конвертируем его в список: list(src) .
После выбора файлов вызывается функция для немедленного их копирования в указанную пользователем директорию. Для этого используется обход по списку и копирование с модулем shutil :
- shutil.copy - скопировать
- listname - файлы из списка
- dst - куда копируем
Функция выбора директории и вложенная функция рекурсивного копирования
askdirectory — выбрать директорию для копирования. В функцию включена проверка для рекурсивного копирования поддиректорий. Если srcname — поддиректория ( os.path.isdir ), будет выполнено рекурсивное копирование ( copytree ). Если в выбранная директория помимо поддиректорий содержит обычные файлы ( os.path.isfile ), копирование этих файлов ( copy ).
os.listdir - возвращает список, содержащий имя директории. Выбрать несколько директорий за раз нельзя (это ограничение связано с askdirectory , не с самим питоном), но можно повторно вызвать функцию копирования файлов и поддиректорий для следующей директории.
os.path.join - "склеивает" пути
Функция, закрывающая программу
Функция, показывающая информационное окно
- root = Tk() — создать главное окно
- m = Menu(root) — создать меню, привязанное к главному окну
- root.config(menu=m) - для создания списка в меню (add_cascade)
- fm = Menu(m) — создание пунктов в списке
Всё дальнейшее просто: fm.add_command — вызовет указанное действие; label — метка, то, как будет называться пункт меню; command — указание на функцию, которая должна быть выполнена при нажатии пунтка меню; pack() — менеджер расположения. Он отвечает за то, как виджеты будут располагаться на главном окне.
root.mainloop() — специальный обязательный метод. Без него главное окно не появится.
Что не так?
Если вам понятен приведённый пример, вы уже можете сказать, чего в нём не хватает. Например, вы можете обнаружить, что при повторном копировании объектов одной и той же директории, замена файлов происходит, а замена поддиректорий — нет. Вам лишь укажут на тот факт, что такая поддиректория уже существует и выполнение программы прекратится. В качестве самостоятельной работы предлагается изучить конструкцию try-except или модуль errno и проработать этот момент. Например:
В Windows копирование файла/файлов работать не будет: сие есть последствие использования этой ОС не православных путей к файлам (обратный слэш). Возможно, пользователям Windows будет интересно изменить код таким образом, чтобы данная функция работала.
Чтобы программа в Windows запускалась при двойном клике, измените расширение на .pyw Кроме того, предлагается поупражняться с tkinter и выводить всплывающее окно "Wait, please!" во время копирования (наподобие того, как это сделано при закрытии программы).
Читайте также: