Как перебрать файлы с помощью Python?
У меня есть папка с десятью файлами, которые я хочу пропустить. Когда я распечатываю имя файла, мой код отлично работает:
import os
indir = '/home/des/test'
for root, dirs, filenames in os.walk(indir):
for f in filenames:
print(f)
Какие принты:
1
2
3
4
5
6
7
8
9
10
Но если я попытаюсь открыть файл в цикле, я получаю ошибку ввода-вывода:
import os
indir = '/home/des/test'
for root, dirs, filenames in os.walk(indir):
for f in filenames:
log = open(f, 'r')
Traceback (most recent call last):
File "/home/des/my_python_progs/loop_over_dir.py", line 6, in <module>
log = open(f, 'r')
IOError: [Errno 2] No such file or directory: '1'
>>>
Нужно ли передавать полный путь файла даже внутри цикла?
Ответы
Ответ 1
Да, вам нужен полный путь.
log = open(os.path.join(root, f), 'r')
Быстрое исправление. Как отмечалось в комментарии, os.walk
делит на поддиры, поэтому вам нужно использовать текущий корневой каталог, а не indir
в качестве базы для соединения пути.
Ответ 2
Если вы просто ищете файлы в одном каталоге (т.е. вы не пытаетесь пересечь дерево каталогов, на которое оно не похоже), почему бы просто не использовать os.listdir():
import os
for fn in os.listdir('.'):
if os.path.isfile(fn):
print (fn)
вместо os.walk(). Вы можете указать путь к каталогу в качестве параметра для os.listdir(). os.path.isfile() определит, является ли данное имя файла для файла.
Ответ 3
Вы должны указать путь, над которым работаете:
source = '/home/test/py_test/'
for root, dirs, filenames in os.walk(source):
for f in filenames:
print f
fullpath = os.path.join(source, f)
log = open(fullpath, 'r')
Ответ 4
Примеры для os.walk в документации показывают, как это сделать:
for root, dirs, filenames in os.walk(indir):
for f in filenames:
log = open(os.path.join(root, f),'r')
Как вы ожидали, что функция "open" будет знать, что строка "1" должна означать "/home/des/test/1" (если "/home/des/test" не является вашим текущим рабочим каталог)?
Ответ 5
Вот фрагмент, который будет обрабатывать дерево файлов для вас:
indir = '/home/des/test'
for root, dirs, filenames in os.walk(indir):
for f in filenames:
print(f)
log = open(indir + f, 'r')