1

所以我正在导入一个名称列表,例如

文本文件将包括:

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()
4

3 回答 3

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))
于 2013-02-12T21:23:21.327 回答
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
于 2013-02-13T03:21:12.843 回答
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)

还有一些评论,我们在这里……</p>

首先,您真的不应该尝试从字符串中手动生成 .xls 文件。您可以使用像openpyxl. 或者,您可以创建 .csv 文件,使用 Python 内置的库很容易创建它们csv,Excel 可以像处理 .xls 文件一样轻松地处理它们。或者,您可以使用win32compywinauto控制 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,它在本地导入一些模块然后什么都不做)。

于 2013-02-14T19:41:52.810 回答