NokiaРаздел для смартфонов и телефонов. Тут море полезной информации, можно бесплатно скачать программы для смартфона, взломать смартфон и многое другое. Все для Symbian 9
Python на Symbian S60 работа с файлами (модуль os и path)
Python на Symbian S60: работа с файлами (модуль os и path)
Модуль os
Модуль os позволяет работать с файлами и папками. Сразу отмечу, русские названия файлов и папок возвращаются и принимаются всеми функциями этого модуля в кодировке UTF-8, поэтому необходимо использовать функции для перекодирования строк - методы decode и encode. listdir(path) Возвращает список имен файлов и папок в папке с именем path. mkdir(path) Создает папку с именем path. makedirs(path) Работает аналогично функции mkdir(), но автоматически создает все необходимые промежуточные папки. remove(path)
Удаляет файл с именем path. rmdir(path) Удаляет каталог с именем path. removedirs(path) Работает аналогично функции rkdir(), но автоматически удаляет все родительские пустые папки. rename(src, dst) Переименовывает файл или папку с именем src в dst. Модуль path Модуль path встроен в модуль os и позволяет работать с путями к файлам и папкам. split(path) Возвращает кортеж из пары строк -(head, tail). Где: tail - последний компонент пути (имя папки или файла), head - остальная часть пути: >>> os.path.split ('c:\system\apps\Python\Python.app') ('c:\system\apps\Python\', 'Python.app') >>> splitdrive(path) Возвращает кортеж из пары строк -(drive, tail). Где: drive - имя диска, head -остальная часть пути: >>> os.path.splitdrive ('c:\system\apps\Python\Python.app') ('c:\', 'system\apps\Python\Python.app') >>> splitext(path) Возвращает кортеж из пары строк -(root, ext). Где: ext - расширение файла, head - остальная часть пути: >>> os.path.splitext ('c:\system\apps\Python\Python.app') ('c:\system\apps\Python\Python', '.app') >>> dirname(path) Возвращает имя каталога пути path. Это первый элемент пары split(path): >>> os.path.dirname ('c:\system\apps\Python\Python.app') 'c:\system\apps\Python' >>> basename(path) Возвращает основное имя пути path. Это второй элемент пары split(path): >>> os.path.basename ('c:\system\apps\Python\Python.app') 'Python.app' >>> join(path1, path2,...) Объединяет пути path: >>> os.path.join('c:\', 'system\apps\Python\', 'Python.app') 'c:\system\apps\Python\Python.app' >>> exists(path) Возвращает 1, если файл или каталог с именем path существует. isfile(path) Возвращает 1, если path указывает на файл. isdir(path) Возвращает 1, если path указывает на папку. getatime(path) Возвращает время последнего доступа к файлу или папке с именем path. getmtime(path) Возвращает время последнего внесения изменения в файл или папку с именем path. getsize(path) Возвращает размер файла или папки с именем path. Работа с файлами Python обладает встроенными возможностями для открытия файлов, чтения их содержимого или записи в них различных данных. open(filename, mode) Возвращает объект-файл с именем filename. Характер работы определяет аргумент mode (по умолчанию 'r'): 1) 'r' - файл открывается для чтения данных; 2) 'w' - для записи данных; 3) 'a' - для дописывания данных. Данный объект имеет следующие методы: read(size) Считывает из файла данные размером size и возвращает в виде строки. Если аргумент опущен, то считывается все содержимое файла. readline() Считывает из файла одну строку, включая символ перехода на новую строку («n»). readlines() Считывает из файла все строки и возвращает их в виде списка. write(string) Записывает строку string в файл. writelines(lines) Записывает строки из списка lines в файл. Символ перехода на новую строку между ними не добавляется. tell() Возвращает текущее положение в файле в байтах от начала файла. seek(offset, whence) Изменяет положение на offset. Характер определения положения зависит от аргумента whence (по умолчанию 0): 1) 0 - новое положение отсчитывается от начала файла; 2) 1 - от конца файла; 3) 2 - от текущего положения в файле; truncate(size) Усекает файл до размера size. close() Закрытие файла. Запомните! Любое открытие файла должно сопровождаться последующим закрытием с помощью этого метода. На этом все. Ниже будет дано описание программы FileMan.py, которая предоставляет основные возможности любого файл-менеджера: навигация по дискам и папкам, удаление и открытие файлов. FileMan.py Программа начинается с подключения нужных модулей: import os,e32,appuifw,key_codes И создания нужных переменных: list=e32.drive_list() path=[] В list будет храниться тот список имен файлов и папок, который передается объекту Listbox для отображения. path хранит список строк, который показывает путь к тому месту в файловой системе, где мы находимся. Т.е. если мы будем находиться в папке 'c:\system\apps\', выглядеть path будет следующим образом: ['c:', 'system', 'apps'] Заканчивается программа строками для создания объекта Listbox (при этом ему передается начальный список имен дисков и указывается, чтобы при нажатии на джойстик вызывалась функция select). Также привязывается к нажатию на «C» вызов функции delete: appuifw.app.body=listbox=appuifw.Listbox(list, select) listbox.bind(key_codes.EKeyBackspace, delete) Также создим меню с единственной функцией для выхода из программы и опишем код для определения источника запуска программы (все стандартно). Опишу функции основной части программы: def create(): global list,path if len(path)==0: list=e32.drive_list() else: full_path='\'.join(path) dirs,files=[],[] for name in os.listdir(full_path): if os.path.isdir(full_path '\' name): dirs.append(name.decode('utf-8')) else: files.append(name.decode('utf-8')) dirs.sort() files.sort() list=[u'<<<'] dirs files listbox.set_list(list) Функция для создания списка имен папок и файлов в новой папке (в ту, которую мы зашли) и его отображении на объекте Listbox: 1) подключаем глобальные переменные; 2) если путь к файлу по длине равен нулю, то отображаем список дисков; 3) иначе мы получаем путь к новой папке с помощью метода строк для объединения элементов списка; 4) создаем два пустых списка для хранения имен файлов и папок соответственно; 5) создаем цикл для перебора имен всех файлов и папок, находящихся в новой папке; 6) если путь указывает к папке, то добавляем его имя в список для папок, по пути перекодируя его. 7) иначе это путь к файлу, поэтому его имя добавляется в другой список. 8) сортируем оба списка по алфавиту; 9) создаем список для вывода, как сумма элемента обозначающего кнопку назад («<<<») и списков имен папок и файлов; 10) устанавливаем новое содержание объекта Listbox. def select(): global list,path index=listbox.current() dir=list[index].encode('utf-8') if dir!='<<<' or len(path)==0: full_path='\'.join(path) if os.path.isdir(full_path '\' dir): path.append(dir) create() else: try: appuifw.Content_handler().open(full_path '\' dir) except: appuifw.note(u'Невозможно открыть файл.','error') else: path.pop() create() Функция вызывается при нажатии джойстика по выделенному элементу, и в зависимости от того его типа (папка или файл) мы осуществляем соответствующие действия (смотрим содержимое папки или открываем файл): 1) получаем номер той строки, которую мы выделили; 2) получаем имя папки (или файла) из списка по его номеру (не забываем перекодировать, так как список содержит строки в Unicode, а нам надо в UTF-8); 3) если выделена кнопка назад («<<<») или path у нас пустой (когда видим на экране список дисков), то получаем путь в виде строки; 4) проверяем, ведет ли этот новый путь (старый путь плюс новое имя) к папке, и если да, то добавляем в путь новое имя и обновляем список объекта Listbox; 5) иначе этот путь ведет к файлу, и мы открываем его; 6) если произошла ошибка при открытии (тип файла не поддерживается системой), то уведомляем пользователя об этом; 7) иначе (т.е. произошло нажатие на кнопку назад) удаляем имя папки, в которой мы находимся (что равносильно «прыжку» назад); 8) и обновляем список объекта Listbox. def delete(): global path file='\'.join(path) '\' list[listbox.current()].encode('utf-8') if os.path.isfile(file): if appuifw.query(u'Удалить файл?', 'query'): try: os.remove(file) except: appuifw.note(u'Невозможно удалить файл.','error') else: appuifw.note(u'Файл удален.') create() Функция для удаления выделенного файла: 1) получаем номер выделенной строки, получаем его имя из списка имен по номеру, перекодируем и складываем с путем к той папке, где мы находимся, -получаем полный путь к файлу (или папке); 2) если этот путь ведет к файлу (здесь папки и отсекаются), то получаем у пользователя подтверждение для удаления; 3) удаляем файл; 4) если произошла ошибка, информируем пользователя об этом; 5) иначе уведомляем об успешном удалении. 6) обновляем список объекта Listbox.
Предполагаю, что если вы читаете эту статью, то предыдущие вы знаете хорошо. Поэтому домашнее задание: добавить функции для переименования файлов и папок для удаления пустых папок; реализовать чтение текстовых файлов (*.txt) и вывод их на объект Text; с помощью объекта Form попробуйте организовать настройки программы. Дерзайте!