所以我正在导入一个名单 e.g。
Textfile包括:
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()
答案 0 :(得分:0)
查看openpyxl
,特别是如果您需要创建.xlsx
个文件。下面的示例假定Excel工作簿创建为空白。
from openpyxl import Workbook
names = ['Eleen','Josh','Robert','Nastaran','Miles']
for name in names:
wb = Workbook()
wb.save('{0}.xlsx'.format(name))
答案 1 :(得分:0)
试试这个:
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
答案 2 :(得分:0)
我仍然不确定你要做什么(而且“不确定”,我的意思是“完全莫名其妙”),但我想我可以解释一些你做错了什么,以及如何做得对:
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)
还有一些评论,而我们在这里......
首先,你真的不应该尝试用字符串手动生成.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
的函数除外,该函数在本地导入一些模块,然后什么都不做。)