问题:使用Python遍历目录
我需要遍历给定目录的子目录并搜索文件。如果我得到一个文件,则必须打开它并更改内容,然后用自己的行替换它。
我尝试了这个:
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
实际遍历目录的工作方式与您对代码的编码方式相同。如果用简单的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)
如果在执行上述操作时仍然出现错误,请提供错误消息。
为Python3更新
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
返回子目录中所有文件的另一种方法是使用Python 3.4中引入的pathlib
模块,该模块提供了一种面向对象的方法来处理文件系统路径(Pathlib在2.7上也可以通过PyPi上的pathlib2模块获得):
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
截至2020年,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
。
3-如果目录包含以开头的文件, .
则默认情况下将不匹配它们。例如,考虑包含card.gif
和的目录 .card.gif
:
>>> import glob
>>> glob.glob('*.gif') ['card.gif']
>>> glob.glob('.c*')['.card.gif']
4-您也可以使用rglob(pattern)
,glob()
与**/
在给定相对模式前面添加调用相同 。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。