我仍然不确定您要做什么(“不确定”是指“完全困惑”),但我想我可以解释一下您做错了什么,以及如何解决做对了:
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)
还有几个 cmets,而我们在这里……
首先,您真的不应该尝试从字符串中手动生成 .xls 文件。你可以使用像openpyxl 这样的库。或者,您可以改为创建 .csv 文件 — 使用 Python 内置的 csv 库可以轻松创建它们,Excel 可以像处理 .xls 文件一样轻松处理它们。或者您可以使用win32com 或pywinauto 来控制Excel 并让它创建您的文件。真的,任何事情都比尝试手动生成它们要好。
其次,您可以写for line in in_file: 的事实意味着in_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 的函数除外,它在本地导入一些模块然后什么都不做)。