категории | RSS

Автор: Газетдинов Альберт

Python на Symbian S60: работа с файлами (модуль os и path) пример FileMan.py

Модуль 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 попробуйте организовать настройки программы. Дерзайте!

DimonVideo
2008-04-04T22:16:41Z

Здесь находятся
всего 0. За сутки здесь было 0 человек

Комментарии 2

#2   liosha2007    

Огромнейшее спасибо! Как раз то, что мне сейчас нужно! То, что нужно, и в самый подходящий момент! Хорошая статья. Еще ни один раз прочитаю.smile


0 ответить

Яндекс.Метрика