62

我有一个文件夹,里面有十个文件,我想循环访问。当我打印出文件名时,我的代码可以正常工作:

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

但是如果我尝试在循环中打开文件,我会收到一个 IO 错误:

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()他们?

4

5 回答 5

92

如果您只是在单个目录中查找文件(即您不想遍历目录树,它看起来不像),为什么不简单地使用os.listdir()

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

代替os.walk()。您可以指定目录路径作为os.listdir()的参数。os.path.isfile()将确定给定的文件名是否用于文件。

于 2012-08-03T18:32:13.667 回答
26

是的,您需要完整路径。

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

是快速修复。正如评论指出的那样,os.walk下降到子目录,因此您确实需要使用当前目录根目录而不是indir作为路径连接的基础。

于 2012-08-03T18:32:00.047 回答
8

您必须指定您正在处理的路径:

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')
于 2016-01-31T13:15:03.887 回答
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”恰好是您当前的工作目录)?

于 2012-08-03T18:34:39.830 回答
4

这是一个将为您遍历文件树的片段:

indir = '/home/des/test'
for root, dirs, filenames in os.walk(indir):
    for f in filenames:
        print(f)
        log = open(indir + f, 'r')
于 2015-08-06T19:49:47.053 回答