我是否需要将另一个目录中文件的完整路径传递给open()?

时间:2012-08-03 18:30:01

标签: python file-io absolute-path

我有一个包含十个文件的文件夹,我想循环播放。当我打印出文件的名称时,我的代码工作正常:

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

5 个答案:

答案 0 :(得分:92)

如果你只是在一个目录中寻找文件(即你试图遍历目录树,它看起来不像),为什么不简单地使用{{3 }}:

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

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

答案 1 :(得分:26)

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

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

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

答案 2 :(得分: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')

答案 3 :(得分:4)

the documentation中os.walk的示例显示了如何执行此操作:

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

答案 4 :(得分:4)

这是一个代码片段,它将为您遍历文件树:

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