我需要传递文件在另一个目录中的完整路径给open()函数吗?

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()函数?


1
你是想遍历一个目录树,还是只对特定目录/文件夹中的常规文件感兴趣? - Levon
我知道这个问题已经存在四年了,但是它仍然没有被采纳的答案。 - user327301
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() 函数可以确定给定的文件名是否为文件。


OP的循环不仅打印一个目录中的文件。它还会递归地打印输入目录下每个子目录中的文件。 - mgilson
@mgilson 我在查看 OP 的代码时可能漏掉了这一点(OP 只涉及文件名而非目录),而问题的一部分是“有一个包含十个文件的文件夹,我想循环遍历它。”.. 我错过了什么信息吗? - Levon
我现在同意了(之前被误导了;)。我们现在站在同一条战线上了。 - mgilson
@EthanBierlein 是的,没错,fn是文件名的缩写,每次迭代当前目录中的文件名列表时,这个变量将会取一个不同的文件名。 - Levon
1
为了更加通用,将“.”更改为path(变量),并更新if语句为if os.path.isfile(os.path.join(path, fn)): - Keir Simmons
显示剩余9条评论

26

是的,你需要完整的路径。

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

这是一个快速的解决方案。正如评论所指出的那样,os.walk会遍历子目录,因此你需要使用当前目录根路径而不是indir作为路径连接的基础。


6
os.walk 会遍历子目录,因此你不应该在这里使用 indir。请使用 root - Steven Rumbalski

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

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”恰好是您的当前工作目录)?


4

这是一个可以帮助你遍历文件树的代码片段:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接