在Python中使用os.walk为对应的文件夹和子文件夹创建一个txt文件

Posted

技术标签:

【中文标题】在Python中使用os.walk为对应的文件夹和子文件夹创建一个txt文件【英文标题】:Using os.walk in Python to create a txt file for a corresponding folder and subfolders 【发布时间】:2015-07-29 06:33:18 【问题描述】:

我一直在尝试创建一个函数 a 使用 os.walk 遍历目录树并创建一个以文件夹命名的文本文件,并且仅在源文件夹中有数据文件时才创建文本文件并将文件附加到该txt文件。它实际上是在另一个映射的网络驱动器上备份数据文件

def copy_from_dest(src, dest):
    os.chdir(src)
    for root, dirs, files in os.walk(".",topdown=True):
        for name in dirs:
            newdir = (os.path.join(root, name))
            os.chdir(newdir)        
            filenames = glob.glob('*.txt')
            if len(filenames) > 1:
                for fname in filenames:
                    add_to_file(src + newdir, fname, dest + newdir, newdir + "_data.txt")
            os.chdir(src)

add_to_file 是一个将文件附加到文本文件并随后删除的函数。我面临的问题是目录的第一个分支完美地工作,第二个分支(或子目录的子目录)在第二个分支或第二步中创建文件,而它应该在第三个中创建。

例如:

Root/ 文件夹工作正常 Root/folderstep1 工作正常 Root/folderstep1/folderstep2/folderstep3将txt文件错误写入folderstep2

请问有人可以帮忙吗?提前致谢!

【问题讨论】:

【参考方案1】:

add_to_file 函数的第四个参数看起来很可疑:您似乎想为当前目录构造一个类似 "folderstep3_data.txt" 的文件名,但您传递的是类似 ./folderstep1/folderstep2/folderstep3_data.txt 的文件名。但由于我不知道add_to_file 在内部是如何工作的,所以我无法确定。

尝试将参数记录到add_to_file

print (src + newdir), fname, (dest + newdir), newdir + "_data.txt"

看看,如果这揭示了问题。

另外两点:

if len(filenames)>1: 应该是>0?或者,如果至少存在 两个 文本文件,您是否只想写一些东西?

另外,由于os.walk() 已经为您遍历了所有子目录,并且还为您提供了每个子目录的文件名列表,如果files (您从os.walk() 获得的变量- loop) 包含一个文本文件(使用str.endswith('.txt') 并且仅使用root 作为目录?

如果你有这样的结构

+ src
+--+ subfolder 1
|  +-- file1.txt
|  +-- file2.txt
|  +--+ subfolder1.2
|     +-- file3.txt
+--+ subfolder 2
   +-- file4.txt

那么os.walk()会给你

root=src, dirs=['subfolder1','subfolder2'], files=[]
root=src\subfolder1, dirs=['subfolder1.2'], files=['file1.txt','file2.txt']
root=src\subfolder1\subfolder1.2, dirs=[], files=['file3.txt']
root=src\subfolder2, files=['file3.txt']

看来rootfiles 应该是足够的信息来调用add_file。所以不需要os.chdir()glob.glob()

【讨论】:

这是 add_to_file 的样子 def add_to_file(src, srcfile, dest, destfile): shutil.copy2(src + "\\" + srcfile, dest) os.chdir(dest) with open(destfile, 'a') as outfile: with open(srcfile, 'r') as readfile: infile = readfile.read() for line in infile: outfile.write(line) outfile.write("\n") os.remove(srcfile) os.chdir(src) 甚至更多chdirs ...正如我所说:os.walk('.') 将为您提供以./ 开头的路径。因此,所有目录都是相对目录,并且您不断更改当前目录。再次:尝试printadd_to_file 的参数(甚至在add_to_file 内部),看看每个步骤使用了哪些目录。此外,您可以使用 os.path.abspath() 使您的路径成为绝对路径(例如,在第一个 forloop 之后,执行 root=os.path.abspath(root) 非常感谢。这是你发表的第一个声明。 add_to_file 函数的第四个参数是问题所在。我现在已经解决并完善了它。再次感谢。

以上是关于在Python中使用os.walk为对应的文件夹和子文件夹创建一个txt文件的主要内容,如果未能解决你的问题,请参考以下文章

python使用os.listdir和os.walk获得文件的路径

python中os.walk的用法详解

python中os.walk的用法详解

python os.walk()

python中的os.walk

Python入门之os.walk()方法