【问题标题】:Create for loop for naming output file Python为命名输出文件Python创建for循环
【发布时间】:2013-02-12 19:21:08
【问题描述】:

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

文本文件将包括:

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

【问题讨论】:

  • 那你有什么问题?另外,请尽量减少代码示例的损坏。
  • 为什么要将每个名称分配给全局?而且,不管你为什么这样做,你仍然有my_list,那么为什么不直接使用for name in my_list:呢?
  • 我稍微改了一下。我为示例显示的代码具有我创建名称列表的区域,它在文件中逐行提取数据。我猜名为“data”的列表将等同于“my_list”
  • 如果我这样做了,我很抱歉措辞很奇怪。我有时很难解释我想要做什么
  • 您是在 Excel 工作簿中添加任何内容,还是只是空文件?

标签: python excel csv for-loop


【解决方案1】:

我仍然不确定您要做什么(“不确定”是指“完全困惑”),但我想我可以解释一下您做错了什么,以及如何解决做对了:

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

【讨论】:

    【解决方案2】:

    看看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))
    

    【讨论】:

      【解决方案3】:

      试试这个:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-04
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        相关资源
        最近更新 更多