为命名输出文件Python创build循环

所以我要input一个名字列表

文本文件将包括:

Eleen Josh Robert Nastaran Miles my_list = ['Eleen','Josh','Robert','Nastaran','Miles'] 

然后我将每个名称分配给一个列表,我想为该列表中的每个名称写一个新的excel文件。

 #1. Is there anyway I can create a for loop where on the line: temp = os.path.join(dir,'...'.xls') _________________________ def high_throughput(names): import os import re # Reading file in_file=open(names,'r') dir,file=os.path.split(names) temp = os.path.join(dir,'***this is where i want to put a for loop for each name in the input list of names***.xls') out_file=open(temp,'w') data = [] for line in in_file: data.append(line) in_file.close() 

我仍然不确定你想做什么(“不确定”,我的意思是“完全不知所措”),但我想我可以解释一些你做错了什么,以及如何做到这一点:

 in_file=open(names,'r') dir,file=os.path.split(names) temp = os.path.join(dir,'***this is where i want to put a for loop for each name in the input list of names***.xls') 

此时,您没有input名称列表。 这就是你从in_file读取的内容,而且还没有读取它。 稍后,您将读取的data读入data ,之后您可以使用它们。 所以:

 in_file=open(names,'r') dir,file=os.path.split(names) data = [] for line in in_file: data.append(line) in_file.close() for name in data: temp = os.path.join(dir, '{}.xls'.format(name)) out_file=open(temp,'w') 

请注意,我把函数调用之外的for循环,因为你必须这样做。 这是一件好事,因为你可能想要打开每个文件的每个path(并对每个文件做些什么),而不是打开一个由文件循环构成的单一path。

但是如果你不坚持使用for循环,那么可能会更接近你正在寻找的东西:列表理解。 你有一个名字列表。 你可以使用它来build立一个path列表。 然后你可以使用它来build立一个打开的文件列表。 喜欢这个:

 paths = [os.path.join(dir, '{}.xls'.format(name)) for name in data] out_files = [open(path, 'w') for path in paths] 

然后,稍后,在build立了要写入所有文件的string之后,可以这样做:

 for out_file in out_files: out_file.write(stuff) 

然而,这是一种奇怪的devise。 主要是因为你必须closures每个文件。 他们可能会被垃圾回收自动closures,即使他们不这样做,他们也可能会被刷新…但是除非您幸运,否则您所写的所有数据都只是坐在内存中的缓冲区中,永远不会写入磁盘。 通常你不想编写依赖幸运的程序。 所以,你想closures你的文件。 有了这个devise,你必须做一些事情:

 for out_file in out_files: out_file.close() 

首先回到我build议的一个大循环可能要简单得多,所以你可以这样做:

 for name in data: temp = os.path.join(dir, '{}.xls'.format(name)) out_file=open(temp,'w') out_file.write(stuff) out_file.close() 

或者,甚至更好:

 for name in data: temp = os.path.join(dir, '{}.xls'.format(name)) with open(temp,'w') as out_file: out_file.write(stuff) 

还有一些意见,我们在这里…

首先,你真的不应该试图从string手动生成.xls文件。 你可以使用像openpyxl这样的库。 或者您可以创build.csv文件,而使用Python内置的csv库可以很容易地创build这些文件,Excel可以像.xls文件一样轻松地处理它们。 或者您可以使用win32compywinauto来控制Excel,并使其创build您的文件。 实际上,任何事情都比试图用手来产生更好。

其次,可以for line in in_file:写入for line in in_file:的事实意味着in_file是某种行的序列。 所以,如果您只想将其转换为行list ,您可以一步完成:

 data = list(in_file) 

但是真的,你首先需要这个列表的唯一原因是你可以稍后循环,创build输出文件,对吗? 那么为什么不拖延,并在第一个地方循环的文件中的行?

无论您如何生成输出内容,都要先做。 然后用文件名列表和文件循环遍历文件。 喜欢这个:

 stuff = # whatever you were doing later, in the code you haven't shown dir = os.path.dirname(names) with open(names, 'r') as in_file: for line in in_file: temp = os.path.join(dir, '{}.xls'.format(line)) with open(temp, 'w') as out_file: out_file.write(stuff) 

这将取代您的示例中的所有代码(除了名为high_throughput函数,在本地导入某些模块,然后什么都不做)。

看看openpyxl ,特别是如果你需要创build.xlsx文件。 下面的示例假定Excel工作簿被创build为空白。

 from openpyxl import Workbook names = ['Eleen','Josh','Robert','Nastaran','Miles'] for name in names: wb = Workbook() wb.save('{0}.xlsx'.format(name)) 

尝试这个:

 in_file=open(names,'r') dir,file=os.path.split(names) for name in in_file: temp = os.path.join(dir, name + '.xls') with open(temp,'w') as out_file: # write data to out_file