我编写了一个Python脚本来处理多个文件中的数据,并创建多达9个新文件作为输出。为此,我创建了9个不同的列表,然后我将其写入最多9个不同的文件(取决于列表是否包含任何项目)。
我的代码非常重复,例如:
if list1 != []:
newfile1 = open(os.path.join(dirpath,"newlist1.txt"),'w')
for i in list1:
newfile1.write(i)
newfile1.close()
if list2 != []:
newfile2 = open(os.path.join(dirpath,"newfile2.txt"),'w')
for i in list2:
newfile2.write(i)
newfile2.close()
.....适用于9种不同的清单 我只是好奇,主要是因为我自己的发展我能以更有效的方式做到这一点吗?我遍历目录中的文件来创建列表,但是我可以遍历内存中的列表来创建输出文件吗?
我可能应该为文件编写创建一个函数但是我不确定如何处理它需要创建的不同输出文件名?每个列表都有不同的输出名称 - 创建不同的变量?最终效果会更高效吗?
答案 0 :(得分:1)
如果您有一个列表lsts
,例如:
lsts = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
然后你可以这样做:
for i, lst in enumerate(lsts, 1):
if lst:
with open(os.path.join(dirpath,"newfile{}.txt".format(i)), 'w') as f:
for elem in lst:
f.write(elem)
检查列表是否为空可以使用if lst
(空列表为false)。同时使用with
上下文打开文件并不需要在之后明确地关闭它。
编辑:构建字典可能更符合逻辑(因此您可以将文件名和数据放在一起):
d = {'file1.txt': ['a', 'b', 'c'],
'file2.txt': ['d', 'e', 'f'],
'file3.txt': ['g', 'h', 'i']}
for filename, lst in d.iteritems():
if lst:
with open(os.path.join(dirpath, filename), 'w') as f:
for elem in lst:
f.write(elem)
答案 1 :(得分:1)
您仍然可以编写一个函数,但您可能需要给它一些参数并指定每个函数中调用的内容:
def writeToFile(listname, fileName = "newlist1.txt"):
if not listname:
with open(os.path.join(dirpath, fileName) , "w") as myFile:
for x in listname:
myFile.write(x)
然后,如果您选择此解决方案,请继续拨打此电话9次。但是,在第一次调用时,第二个参数已经完成了。
writeToFile(list1)
writeToFile(list2, "newList2.txt")
等等,等等。