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

Модуль os

Скачай пример FileMan.py

Модуль 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

Скачай пример 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)

Рис. 1. Начальное окно программы FileMan.py – список дисков.

Также создим меню с единственной функцией для выхода из программы и опишем код для определения источника запуска программы (все стандартно).

Опишу функции основной части программы:

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.

Рис. 2. Смотрим содержимое папки.

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.

Рис. 3. Решаем – удалить файл или нет?

Скачай пример FileMan.py

Предполагаю, что если вы читаете эту статью, то предыдущие вы знаете хорошо. Поэтому домашнее задание: добавить функции для переименования файлов и папок для удаления пустых папок; реализовать чтение текстовых файлов (*.txt) и вывод их на объект Text; с помощью объекта Form попробуйте организовать настройки программы. Дерзайте!






Рекомендуемый контент




Copyright © 2010-2017 housea.ru. Контакты: info@housea.ru При использовании материалов веб-сайта Домашнее Радио, гиперссылка на источник обязательна.