我需要遍历给定目录的子目录并搜索文件。如果我得到一个文件,我必须打开它并更改内容并用我自己的行替换它。
我试过了:
import os
rootdir ='C:/Users/sid/Desktop/test'
for subdir, dirs, files in os.walk(rootdir):
for file in files:
f=open(file,'r')
lines=f.readlines()
f.close()
f=open(file,'w')
for line in lines:
newline = "No you are not"
f.write(newline)
f.close()
但是我收到了一个错误。我究竟做错了什么?
答案 0 :(得分:241)
实际遍历目录的方式与编码时一样。如果用简单的print
语句替换内部循环的内容,可以看到每个文件都找到了:
import os
rootdir = 'C:/Users/sid/Desktop/test'
for subdir, dirs, files in os.walk(rootdir):
for file in files:
print os.path.join(subdir, file)
如果在运行上述操作时仍然出现错误,请提供错误消息。
答案 1 :(得分:8)
返回子目录中所有文件的另一种方法是使用Python 3.4中引入的the pathlib
module,它提供了一种面向对象的方法来处理文件系统路径(Pathlib也可以通过the pathlib2 module on PyPi在Python 2.7上使用) :
from pathlib import Path
rootdir = Path('C:/Users/sid/Desktop/test')
# Return a list of regular files only, not directories
file_list = [f for f in rootdir.glob('**/*') if f.is_file()]
# For absolute paths instead of relative the current dir
file_list = [f for f in rootdir.resolve().glob('**/*') if f.is_file()]
从Python 3.5开始,glob
模块也支持递归文件查找:
import os
from glob import iglob
rootdir_glob = 'C:/Users/sid/Desktop/test/**/*' # Note the added asterisks
# This will return absolute paths
file_list = [f for f in iglob('**/*', recursive=True) if os.path.isfile(f)]
上述任一方法中的file_list
都可以迭代而无需嵌套循环:
for f in file_list:
print(f) # Replace with desired operations
答案 2 :(得分:1)
截至 2019 ,glob.iglob(path/**, recursive=True)
似乎是最 pythonic 的解决方案,即:
import glob, os
for filename in glob.iglob('/pardadox-music/**', recursive=True):
if os.path.isfile(filename): # filter dirs
print(filename)
输出:
/pardadox-music/modules/her1.mod
/pardadox-music/modules/her2.mod
...
注意:
1- glob.iglob
glob.iglob(pathname, recursive=False)
返回一个迭代器,该迭代器产生与
glob()
相同的值,而实际上并没有同时存储它们。
2-如果递归为True
,则模式'**'
将匹配所有文件,并且
零个或多个directories
和subdirectories
。
。