Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python迭代目录_Python_Directory - Fatal编程技术网

用Python迭代目录

用Python迭代目录,python,directory,Python,Directory,我需要遍历给定目录的子目录并搜索文件。如果我得到一个文件,我必须打开它,更改内容,并用我自己的行替换它 我试过这个: 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()

我需要遍历给定目录的子目录并搜索文件。如果我得到一个文件,我必须打开它,更改内容,并用我自己的行替换它

我试过这个:

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

但是我犯了一个错误。我做错了什么

实际遍历目录的工作方式与您编写的相同。如果用一个简单的
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))

返回子目录中所有文件的另一种方法是使用Python 3.4中介绍的,它提供了一种面向对象的方法来处理文件系统路径(在Python 2.7上,Pathlib也可通过以下方式获得):

自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(rootdir_glob, recursive=True) if os.path.isfile(f)]
上述任何一种方法的
文件列表
都可以在不需要嵌套循环的情况下进行迭代:

for f in file_list:
    print(f) # Replace with desired operations
从python>=开始,您可以使用
**
,它似乎是最具python风格的解决方案,即:

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(路径名,递归=False)

返回一个迭代器,该迭代器生成与
glob()
相同的值,而不实际同时存储所有值

2-如果recursive为
True
,则模式
'**'
将匹配任何文件和 零个或多个
目录
子目录

3-如果目录包含以
开头的文件,则默认情况下不会匹配这些文件。例如,考虑包含“<代码>卡”、“GIF <代码> >和<代码> .CARI.GIF <代码>:

的目录。
>>> import glob
>>> glob.glob('*.gif') ['card.gif'] 
>>> glob.glob('.c*')['.card.gif']
4-您还可以使用
rglob(模式)

这与调用
glob()?另外,请提供错误详细信息。我收到的错误消息是找不到cool.txt文件。在我的测试文件夹中,我有一个名为src的文件夹,在src文件夹中,我有另一个名为main的文件夹,在这个文件夹中我有cool.txt你能把错误写在问题中吗?一年多以后,我真不敢相信我又回来要求发布错误了@WolfC:/Users/sid/Desktop/test\src\app/cool.txt C:/Users/sid/Desktop/test\src\app/woohoo.txt在我的代码的open语句中,我想我必须给出文件的绝对路径。导入os rootdir='C:/Users/spemmara/Desktop/test/src/app/'用于操作系统中的subdir、dirs和文件。walk(rootdir):用于文件中的文件:f=open(subdir+'/'+file,'r')line=f.readlines()f.close()f=open(subdir+'/'+file,'w')用于行中的行:newline=“嘿,我知道”谢谢你,伙计。它的solvedSir,我得到的是isDirectoryError对于Python3.6来说,这里什么更可取?@PhoenixDev我没有听说过一种方法被推荐优于另一种方法。我更喜欢自己使用
pathlib
,主要是因为我喜欢面向对象的方法语法。还有其他区别,例如路径库返回特定的路径类而不是字符串,并且库之间的可用函数不同(例如,
os.path.expanduser(“~”)
vs
path.home()
)。浏览文档,看看您更喜欢哪种方法。您可以使用
**
而不是在glob模式中添加
**
。在您的代码中,
rootdir\u glob
的确切用途是什么?O.O这只是一个完整的路径示例吗?顺便说一句:简短版本:
import os,glob
+
file\u list=[f代表glob.iglob('***',recursive=True)中的f,如果os.path.isfile(f)]
@joelostblom,我建议也使用
os
来创建跨平台路径:)-无论如何,基于您的想法,我今天创建了一个小工具来计算N个目录树中的所有文件及其大小,因此您可以快速进行一些基本的完整性预检查-我已经发布了它-打印中有一些“打字错误”()但除此之外,它还起到了一种魅力的作用:)这个pythonic解决方案不会列出隐藏的文件(也称为dotfiles),而被接受的解决方案会列出隐藏的文件。@ashrasmun您提到的内容在中有很好的解释
>>> import glob
>>> glob.glob('*.gif') ['card.gif'] 
>>> glob.glob('.c*')['.card.gif']