Большинство программ запрашивают у пользователей информацию, например вводят личные данные, настройки игры и т.д. Когда пользователь закрывает программу или покидает ваше приложение, введенные данные лучше сохранить, чтобы пользователь не вводил их при каждом посещение. Простейший способ сохранения данных основан на использовании модуля json .
1. Функции json.dump() и json.load() |
2. Сохранение и чтение данных, сгенерированных пользователем |
1. Функции json.dump() и json.load() в Python
Модуль json обеспечивает запись простых данных Python в файл и загружает данные из файла при следующем запуске программы. Формат данных json не привязан к Python, поэтому данные в этом формате могут передаваться программам, написанные на других языках программирования. Формат JSON(JavaScript Object Notation) был разработан для JavaScript, а после стал использоваться во многих языках программирования. Модуль json может использоваться для обмена данными между программами.
Тестирование и сохранение файлов с кодом в PyCharm (Python). [мини туториал]
Приведем пример простой программы, которая сохраняет список чисел в память с помощью функции json.dump() и вторую программу, которая читает этот список c помощью функции json.load() обратно в память.
numbers = [1, 2, 3, 4, 5]
filename = ‘numbers.json’
with open (filename, ‘w’) as f :
json.dump (numbers, f )
В начале импортируем модуль json . Затем создаем список numbers. В переменной filename присваиваем название файла, в которым будем сохранять список. Обычно для таких файлов принято использовать расширение .json , указывающее что данные хранятся в формате JSON. Затем файл открывается в режиме записи ‘ w ‘. В конце функция json.dump() сохраняет список numbers в файле ‘numbers.json’.
Данная программа ничего не выводит, но если открыть папку, в которой написана программа, то там появится файл numbers.json, внутри которого хранится наш список.
[1, 2, 3, 4, 5]
Теперь напишем вторую программу, которая читает список обратно в память с помощью функции json.load().
filename = ‘numbers.json’
with open (filename) as f :
numbers = json.load ( f )
print(numbers)
В начале импортируем модуль json . В переменной filename используем тот же файл, в который ранее были записаны данные ‘numbers.json’. Далее файл открываем в режиме чтения. Данные с помощью функции json.load() загружаются и сохраняются в переменную numbers и с помощью функции print выводятся на экран:
[1, 2, 3, 4, 5]
Модуль json позволяет организовать простейший обмен данными между программами.
2. Сохранение и чтение данных, сгенерированных пользователем на Python
При работе с данными, сгенерированными пользователем, можно использовать модуль json . Без сохранения информация о пользователе будет потеряна при остановке программы. Приведем пример программы, которая запрашивает у пользователя имя при первом запуске и выводит его при последующих запусках программы:
4. Сохранение и запуск программы
name = input («Введите ваше имя: «)
filename = ‘name.json’
with open (filename, ‘w’) as f :
json.dump (numbers, f )
print(f»Добро пожаловать на сайт !»)
В начале программа запрашивает имя пользователя с помощью функции input и сохраняет имя в переменной name. Далее открываем файл, находящийся в переменной filename в режиме записи ‘ w ‘ и с помощью функции json.dump() сохраняем имя пользователя в файле. Запустив эту программу, мы получим:
Введите ваше имя: Артур
Добро пожаловать на сайт Артур!
Теперь приведем пример программы, которая приветствует пользователя уже известного ей и сохраненного в файле:
with open (filename) as f :
name = json.load ( f )
print(f»С возвращением !»)
Программа читает информация из файла ‘name.json’ и сохраняет в переменную name. После этого программы выводит приветствие на экран:
С возвращением Артур!
Теперь эти две программы можно объединить в одну. Когда программа будет запускаться, Python должен взять имя из файла, если это возможно, если файла ‘name.json’ не существует, запросить имя и сохранить на будущее. Так как в случае отсутствия файла будет возникать ошибка, воспользуемся блоком try-except.
filename = ‘name.json’
try:
with open (filename) as f :
name = json.load ( f )
except FileNotFoundError:
name = input («Введите ваше имя: «)
with open (filename, ‘w’) as f :
json.dump (numbers, f )
print(f»Добро пожаловать на сайт !»)
else:
print(f»С возвращением !»)
В начале программа пытается открыть файл ‘name.json’. Если файл существует и не возникает ошибка FileNotFoundError , то выводится сообщение из блока else. Если программа запускается впервые и файла не существует, возникает ошибка и пользователю предлагают ввести имя. При первом выполнение программы результат выглядит так:
Введите ваше имя: Жак
Добро пожаловать на сайт Жак!
Если программа была выполнена хоть один раз, то результат выглядит так:
С возвращением Жак!
Источник: pythonclass.ru
Сохранение файлов с python
В данном посте хотелось бы предложить написать небольшое приложение, использующее графический интерфейс. Задача выбора подходящего инструмента для осуществления этой задумки может оказаться достаточно нетривиальной. 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.
Начали импорт
# pybackup.py # #! /usr/bin/env python # -*- coding: utf-8 -*- import os import shutil from tkinter.messagebox import * from tkinter.filedialog import *
модуль os представляет переносимый интерфейс к часто используемым службам операционной системы. Нами будет использован для указания пути ( os.path );
shutil используется для таких операций над файлами как копирование, переименование, удаление;
импортирование модулей из tkinter.filedialog даст нам возможность вызывать диалоговые окна, из messagebox — создавать сообщения, уведомления для пользователя
Функция выбора директории для копирования, получение доступа к описанию функции.
def savefiles(): »’Ask where save your files»’ global dst dst = askdirectory() print(type(dst)) print(dst)
Прежде всего, никогда не стоит забывать документировать ваш код хотя бы для того, чтобы спустя некоторое время вы сами могли в нём разобраться. В примере сразу ниже функции даётся её краткое описание.
При импорте модуля можно будет обратиться к ней, вызвав команду backup.savefiles.__doc__ — то есть имя_модуля.имя_функции.__описание__ :
>>> backup.savefiles.__doc__ ‘Ask where save your files’
Полученный нами в итоге модуль не предназначен для расширения или импортирования, тем не менее строки документации создавать всё же нужно.
Далее используется переменная dst, которая впоследствии примет значение указанной пользователем директории. Значение будет строковым. Здесь переменная сделана глобальной поскольку должна быть доступна и другим функциям.
dst = askdirectory() — запросит у пользователя выбор директории для сохранения файлов
print (type(dst)) и print(dst) будут выводить в консоли информацию для нас, дабы мы могли увидеть какой тип получился у переменной, когда пользователь выбрал директорию. Можно удалить строки с print .
Функция выбора файлов для бекапа и вложенная функция копирования выбранных файлов
def _selectfile(): »’Select your files for backup»’ src = askopenfilenames() src = list(src) print(type(src)) print(src) def save(): »’Save files»’ for listcopy in src: listname = os.path.join(listcopy) shutil.copy(listname, dst) print(«Backup file is OK») save()
askopenfilenames — выбрать файлы для копирования. Поскольку в итоге мы получим кортеж, а кортежи неизменяемы, сразу же конвертируем его в список: list(src) .
После выбора файлов вызывается функция для немедленного их копирования в указанную пользователем директорию. Для этого используется обход по списку и копирование с модулем shutil :
- shutil.copy — скопировать
- listname — файлы из списка
- dst — куда копируем
Функция выбора директории и вложенная функция рекурсивного копирования
def _selectdirectory(): »’Select your directory for backup»’ src2 = askdirectory() print(type(src2)) print(src2) def save2(): »’Save directories and files»’ print («make backup » + src2) names = os.listdir(src2) if not os.path.exists(dst): os.mkdir(dst) for name in names: srcname = os.path.join(src2, name) dstname = os.path.join(dst, name) if os.path.isdir(srcname): shutil.copytree(srcname, dstname) if os.path.isfile(srcname): shutil.copy(srcname, dstname) print(«Backup is OK») save2()
askdirectory — выбрать директорию для копирования. В функцию включена проверка для рекурсивного копирования поддиректорий. Если srcname — поддиректория ( os.path.isdir ), будет выполнено рекурсивное копирование ( copytree ). Если в выбранная директория помимо поддиректорий содержит обычные файлы ( os.path.isfile ), копирование этих файлов ( copy ).
os.listdir — возвращает список, содержащий имя директории. Выбрать несколько директорий за раз нельзя (это ограничение связано с askdirectory , не с самим питоном), но можно повторно вызвать функцию копирования файлов и поддиректорий для следующей директории.
os.path.join — «склеивает» пути
Функция, закрывающая программу
def close_win(): »’Close window and exit programm»’ if askyesno(«Exit», «Do you want to quit?»): root.destroy()
Функция, показывающая информационное окно
def about(): showinfo(«Backup», «This is simple backup programm.n(test version)»)
root = Tk() m = Menu(root) root.config(menu=m) fm = Menu(m) m.add_cascade(label=»File»,menu=fm) fm.add_command(label=»Select directory for save», command = savefiles) fm.add_command(label=»Select files for copy.»,command=_selectfile) fm.add_command(label=»Select directories for copy», command=_selectdirectory) fm.add_command(label=»Exit»,command=close_win) hm = Menu(m) m.add_cascade(label=»Help»,menu=hm) hm.add_command(label=»About»,command=about) txt = Text(root,width=40,height=25,font=»22″) txt.pack() root.mainloop()
- 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 и проработать этот момент. Например:
def save2(): »’Save directories»’ try: print («make backup » + src2) names = os.listdir(src2) if not os.path.exists(dst): os.mkdir(dst) for name in names: srcname = os.path.join(src2, name) dstname = os.path.join(dst, name) if os.path.isdir(srcname): shutil.copytree(srcname, dstname) if os.path.isfile(srcname): shutil.copy(srcname, dstname) print(«Backup is OK») except OSError: shutil.rmtree(dstname) print(«Try again») if os.path.isdir(srcname): shutil.copytree(srcname,dstname) if os.path.isfile(srcname): shutil.copy(srcname,dstname) print(«Backup is OK») save2()
В Windows копирование файла/файлов работать не будет: сие есть последствие использования этой ОС не православных путей к файлам (обратный слэш). Возможно, пользователям Windows будет интересно изменить код таким образом, чтобы данная функция работала.
Чтобы программа в Windows запускалась при двойном клике, измените расширение на .pyw Кроме того, предлагается поупражняться с tkinter и выводить всплывающее окно «Wait, please!» во время копирования (наподобие того, как это сделано при закрытии программы).
Для удобства файл целиком: backup.py
Источник: www.unix-lab.org
Сохранение, загрузка и повторный вызов работы в окне Python
В окне Python есть возможность для изучения и экспериментирования с Python в приложении ArcGIS for Desktop . Во многих случаях полезно сохранять проделанную в окне Python работу в файл, который можно будет использовать в следующих сеансах.
Содержимое окна Python можно сохранить в файл Python или текстовом файе. Щелкните окно Python правой кнопкой мыши и выберите Сохранить как (Save As) , чтобы сохранить код либо в файл Python ( .py ), либо в текстовый файл ( .txt ). При сохранении в файл Python можно сохранить только код. При сохранении в текстовом файле все содержимое окна Python, включая код, возвращаемые сообщения и командную строку ( >>> ), будет записано в выходной файл.
При сохранении кода из окна Python в выходной файл будет записано только то, что в данный момент находится в окне Python . Удаленные фрагменты не будут записаны в файл.
Загрузка в окно Python
Окно Python является интерактивным интерпретатором, который удобен для быстрого выполнения инструментов геообработки или других команд Python. Однако код, который уже был написан и сохранен в автономный скрипт или в файл Python, также можно загрузить в окно Python, изменить и выполнить. Ниже показан простой скрипт, который просматривает класс объектов и поле и создает уникальный список значений поля. Это достаточно простой пример, но ввод вручную всех 13 его строк в окно Python может занять продолжительное время. Вместо этого щелкните правой кнопкой в окне Python и выберите Загрузить (Load) . Выбранный вами код (сохраненный в автономном скрипте или как файл Python) будет немедленно загружен в окно Python . После загрузки в окно Python можно отредактировать положение класса объектов, имя поля или синтаксис, затем выполнить код, поместив курсор в конце кода и нажав клавишу ENTER .
Создает список уникальных значений поля на основе класса объектов и имени поля.
import arcpy featureclass = «C:/data/county.gdb/hospital» field = «Zip» valueList = [] rows = arcpy.da.SearchCursor(featureclass, [field]) for row in rows: valueList.append(row[0]) uniqueSet = set(valueList) uniqueList = list(uniqueSet) uniqueList.sort() print(uniqueList)
Повторный вызов кода Python
Строки кода, выполненные ранее, можно вызвать снова, используя клавиши стрелок вверх и вниз. Это позволяет вставить указанную строку в место текущего положения курсора. Строку кода можно отредактировать и выполнить, либо выполнить ее еще раз в неизменном виде.
Источник: desktop.arcgis.com