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()仅将每个扩展的最后一行写入文件。
答案 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()