воскресенье, 10 июля 2016 г.

Как обойти дерево директорий на языке Python – руководство к os.walk

Основы проход директорий на языке Python

Здесь приведен очень простой пример обхода дерево директорий, печать имен директорий и списка файлов в каждой из них:
1
2
3
4
5
6
7
8
9
# Import the os module, for the os.walk function
import os

# Set the directory you want to start from
rootDir = '.'
for dirName, subdirList, fileList in os.walk(rootDir):
    print('Found directory: %s' % dirName)
    for fname in fileList:
        print('\t%s' % fname)




os.walk скрывает детали и на каждом проходе цикла выдает три объекта:
  • dirName: следующую найденную директорию.
  • subdirList: список поддиректорий в текущей директории.
  • fileList: список файлов в текущей директории.
Рассмотрим пример директории:
+--- test.py
|
+--- [subdir1]
|     |
|     +--- file1a.txt
|     +--- file1b.png
|
+--- [subdir2]
|
+--- file2a.jpeg
+--- file2b.html
Код программы выведет следующее:
1
2
3
4
5
6
7
8
Found directory: .
file2a.jpeg
file2b.html
test.py
Found directory: ./subdir1
file1a.txt
file1b.png
Found directory: ./subdir2

понедельник, 4 июля 2016 г.

Как записать в файл русские символы в Python?

В python 3 на Windows функция locale.getpreferredencoding(False) возвращает 'cp1251'. Именно с этой кодировкой открывается новый файл по умолчанию, и, как следствие, к ней приводятся строки, записываемые в этот файл.

Если просмотреть директории на диске с помощью os.walk(), то эта функция вернет набор директорий и имен файлов. Если эти имена у вас на русском языке и вы захотели записать их в файл, у вас проблема.

Решение: открывать файл с опцией кодирования файла как 'utf-8':
with open(logname, 'w', encoding='utf-8') as logfile:
   ...

  

Проверка существует ли файл в папке на языке Python

Проверка существует ли файл в папке на языке Python

1. os.path.isfile(path)

Эта функция возвращает true, если данный путь является существующим обычным файлом. Из этого следует, что символические связи (symbolic links) в виде os.path.islink(path) тоже будут true пока os.path.isfile(path) также будет true. Это удобная функция, что бы проверить существует ли файл. К сожалению эта функция только проверяет наличие файла, но не гарантирует имеет ли пользователь доступ к этому файлу. Она говорит вам, что файл существует точно в момент вызова функции. Вполне возможно (хотя не хотелось бы), что во время между тем как вызвал функцию и открываешь файл, его кто-то удалил и перенес/переименовал.
Например, здесь показан такой случай неудачного открытия файла:
1
2
3
4
5
6
>>> os.path.isfile('foo.txt')
True
>> f = open('foo.txt', 'r')
Traceback (most recent call last):
File "", line 1, in
IOError: [Errno 13] Permission denied: 'foo.txt'

2. os.access(path, mode)

Эта функция проверяет имеет ли текущий пользователь (с реальным uid/gid) доступ (привилегии на чтение и/или запись) к объекту с данным путем. Чтобы проверить этот файл доступен на чтение используют режим os.R_OK, а на запись используют режим os.W_OK. Например.
1
2
3
4
5
6
7
>>> # Check for read access to foo.txt
>>> os.access('foo.txt', os.R_OK)
True # This means the file exists AND you can read it.
>>>
>>> # Check for write access to foo.txt
>>> os.access('foo.txt', os.W_OK)
False # You cannot write to the file. It may or may not exist.
Если вы планируете получить доступ к файлу, использование этой функции обезопасит вас попытка доступа к не разрешенного для вас файла. Но возможность того, что в период между проверкой разрешенного доступа и физическим открытием кто-то удалит или переименует файл остается.
1
2
3
4
5
6
7
8
>>> # The file 'foo.txt' currently exists and is readable.
>>> if os.access('foo.txt', os.R_OK):
>>> # After executing os.access() and before open(),
>>> # another program deletes the file.
>>> f = open('foo.txt', 'r')
Traceback (most recent call last):
File "", line 1, in
IOError: [Errno 2] No such file or directory: 'foo.txt'

3. Доступ к файлу (открытие файла).

Попытавшись открыть файл, вы не только убедитесь, что файл существует но и доступен для вас.
1
2
3
4
5
try:
f = open('foo.txt')
f.close()
except IOError as e:
print('Упс!')
Этот код можно легко трансформировать в функцию.
1
2
3
4
5
6
7
8
9
def file_accessible(filepath, mode):
''' Проверка существует ли файл и доступен ли. '''
try:
f = open(filepath, mode)
f.close()
except IOError as e:
return False


return True
Например, ее можно использовать следующим образом:
1
2
3
4
5
6
7
>>> # Say the file 'foo.txt' exists and is readable,
>>> # whereas the file 'bar.txt' doesn't exist.
>>> foo_accessible = file_accessible('foo.txt', 'r')
True
>>>
>>> bar_accessible = file_accessible('bar.txt', 'r')
False

Jackson Cooper 

 

X-Plane 11, 12 - любитель, Фото любитель со стажем

Постоянные читатели

Архив блога