将不同扩展名的文件名写入不同的文本文件

时间:2019-03-16 12:10:29

标签: python file-handling os.walk

import os

exts = ['ppt', 'pptx', 'doc', 'docx', 'txt', 'pdf', 'epub']
files = []

for root, dirnames, filenames in os.walk('.'):
    for i in exts:
        for file in filenames:
            if file.endswith(i):
                file1 = os.path.join(root, file)
                print(file1)
                with open(os.getcwd()+ r"\ally_"+i+".txt", 'w+') as f:
                    f.write("%s\n" % file1)

我正在尝试这段代码。如何使用ex写入系统中的所有文件。 doc扩展到桌面上名为all_docs.txt的文件中? for循环中的file.write()仅将每个扩展的最后一行写入文件。

3 个答案:

答案 0 :(得分:0)

您需要以追加模式(a而不是写入模式(w)打开日志文件,因为使用w之前文件将被截断(删除所有内容)任何新内容都将写入其中。

您可以查看open()的文档。 This answer还概述了所有文件模式。

它可以与a一起使用吗?

答案 1 :(得分:0)

with open(os.getcwd()+ r"\ally_"+i+".txt", 'w+') as f:
    f.write("%s\n" % file1)

根据https://docs.python.org/2/library/functions.html#open,“ w +”操作会截断文件。

  

模式“ r +”,“ w +”和“ a +”打开文件进行更新(读取和写入); 请注意,“ w +”会截断文件

答案 2 :(得分:0)

w+的模式open导致截断文件,这是丢失行的原因,只有最后一行会停留在该位置。 另一个小问题可能是这种连接路径和文件名的方法不可移植。为此,您应该使用os.path.join

            with open(os.path.join(os.getcwd(),"ally_"+i+".txt"), 'a') as f:
                f.write("%s\n" % file1)

另一个问题可能是在具有许多目录和文件的情况下的每周性能。 在您的代码中,您将遍历每个扩展名的目录中的文件名,并一次又一次打开输出文件。 另一个问题可能是扩展的检查。在大多数情况下,扩展名可以通过检查文件名的结尾来确定,但有时可能会引起误解。例如。 '.doc'是扩展名,但是在文件名'Medoc'中,结尾'doc'的名称中只有3个字母。 因此,我为这些问题提供了示例解决方案:

import os

exts = ['ppt', 'pptx', 'doc', 'docx', 'txt', 'pdf', 'epub']
files = []
outfiles = {}
for root, dirnames, filenames in os.walk('.'):
        for filename in filenames:
            _, ext = os.path.splitext(filename)
            ext = ext[1:] # we do not need "."
            if ext in exts:
                file1 = os.path.join(root, filename)
                #print(i,file1)
                if ext not in outfiles:
                    outfiles[ext] = open(os.path.join(os.getcwd(),"ally_"+ext+".txt"), 'a')
                outfiles[ext].write("%s\n" % file1)
for ext,file in outfiles.iteritems():
    file.close()