为命名输出文件Python创建for循环

时间:2013-02-12 19:21:08

标签: python excel csv for-loop

所以我正在导入一个名单 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()

3 个答案:

答案 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文件一样轻松地处理它们。或者,您可以使用win32compywinauto来控制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的函数除外,该函数在本地导入一些模块,然后什么都不做。)