如何用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 

但是,如果我尝试打开循环中的文件,我得到一个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' >>> 

我是否需要在循环内传递文件的完整path?

是的,你需要完整的path。

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

是快速修复。 正如注释所指出的, os.walk会变成子目录,所以你需要使用当前的目录根目录而不是indir作为path连接的基础。

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

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

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

您必须指定您正在处理的path:

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

文档中的 os.walk示例演示如何执行此操作:

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

你如何期待“open”函数知道string“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')