我仍然不确定您要做什么(并且“不确定”,我的意思是“完全困惑”),但我想我可以解释您做错的一些事情,以及如何正确地做:
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')
此时,您没有输入的姓名列表。这就是您正在阅读的内容in_file
,而您还没有阅读。稍后,您将那些命名为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 循环放在函数调用之外,因为您必须这样做。这是一件好事,因为您可能希望在该循环内打开每个路径(并对每个文件执行操作),而不是打开由文件循环构成的单个路径。
但是,如果您不坚持使用 for 循环,那么有些东西可能更接近您正在寻找的东西:列表推导。你有一个名字列表。您可以使用它来构建路径列表。然后您可以使用它来构建打开文件的列表。像这样:
paths = [os.path.join(dir, '{}.xls'.format(name)) for name in data]
out_files = [open(path, 'w') for path in paths]
然后,稍后,在您构建了要写入所有文件的字符串之后,您可以执行以下操作:
for out_file in out_files:
out_file.write(stuff)
然而,这是一种奇怪的设计。主要是因为您必须关闭每个文件。它们可能会被垃圾收集自动关闭,即使没有,它们也可能会被刷新……但除非你很幸运,否则你写的所有数据都只是在内存中的缓冲区中,永远不会被写入磁盘。通常,您不想编写依赖于运气的程序。所以,你想关闭你的文件。使用这种设计,您必须执行以下操作:
for out_file in out_files:
out_file.close()
回到我一开始建议的一个大循环可能要简单得多,所以你可以这样做:
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)
还有一些评论,我们在这里……</p>
首先,您真的不应该尝试从字符串中手动生成 .xls 文件。您可以使用像openpyxl
. 或者,您可以创建 .csv 文件,使用 Python 内置的库很容易创建它们csv
,Excel 可以像处理 .xls 文件一样轻松地处理它们。或者,您可以使用win32com
或pywinauto
控制 Excel 并使其创建您的文件。真的,任何事情都比尝试手动生成它们要好。
其次,您可以编写的事实for line in in_file:
意味着 anin_file
是某种行序列。因此,如果您只想将其转换list
为一行,您可以一步完成:
data = list(in_file)
但实际上,您首先需要此列表的唯一原因是您可以稍后循环它,创建输出文件,对吗?那么,为什么不先推迟,然后循环遍历文件中的行呢?
无论您做什么来生成输出内容,都请先执行此操作。然后用文件名列表循环文件并写东西。像这样:
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
,它在本地导入一些模块然后什么都不做)。