Подтвердить что ты не робот

Как перебрать файлы с помощью 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'
>>> 

Нужно ли передавать полный путь файла даже внутри цикла?

4b9b3361

Ответ 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')