Нужно ли мне передать полный путь к файлу в другой каталог, чтобы открыть ()?


у меня есть папка с десятью файлами, которые необходимо перебрать. Когда я распечатываю имя файла, мой код отлично работает:

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'
>>> 

мне нужно передать полный путь к файлу даже внутри цикла в open() них?

5 62

5 ответов:

Да, нужен полный путь.

log = open(os.path.join(root, f), 'r')

- Это легко исправить. Как было указано в комментарии,os.walk опускается на подкаталоги, так что вы должны использовать текущий корневой каталог, а не indir как основание для соединения пути.

Если вы просто ищете файлы в одном каталоге (т. е. вы не попытка пересечь дерево каталогов, на которое оно не похоже), почему бы просто не использовать ОС.listdir():

import os  
for fn in os.listdir('.'):
     if os.path.isfile(fn):
        print (fn)

на месте os.прогулка(). Вы можете указать путь к каталогу в качестве параметра ОС.listdir(). ОС.путь.isfile() определит, является ли данное имя файла для файла.

вы должны указать путь, по которому вы работаете:

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')

примеры для ОС.заходите документация показать, как это сделать:

for root, dirs, filenames in os.walk(indir):
    for f in filenames:
        log = open(os.path.join(root, f),'r')

Как вы ожидали, что функция " открыть "узнает, что строка" 1 "должна означать" /home/des/test/1 "(Если" /home/des/test " не является вашим текущим рабочим каталогом)?

вот фрагмент, который будет ходить дерево файлов для вас:

indir = '/home/des/test'
for root, dirs, filenames in os.walk(indir):
    for f in filenames:
        print(f)
        log = open(indir + f, 'r')