【问题标题】:Python and csv.writer: Open in every loop or keep open?Python 和 csv.writer:在每个循环中打开还是保持打开?
【发布时间】:2015-05-07 05:16:11
【问题描述】:

在我的小 Python 脚本中,我打开一个 csv 文件,向其写入标题,处理一个循环,在该循环中我打开许多其他 csv 文件以查看它们,最后我将每个循环写入第一个 csv:

import csv

with open(output_file, 'wb') as f:
    outfileWriter = csv.writer(f, delimiter=',')
    # write header

for loop_file in a_list_of_files:
    with open(loop_file) as s:
        # calculate something on the file and write one line to f

现在是保持 f 打开(即缩进循环)还是打开它一次对等循环更好?什么更 Pythonic/更快?

【问题讨论】:

  • 这个问题将吸引大多数基于偏好的答案,因此不属于 StackOverflow(可能在 CodeReview),因为您没有真正的问题(“我的代码没有” t 工作”/“我如何用那种语言做到这一点”)。话虽如此:在您的循环中,收集数据,将数据添加到列表中,然后在数据收集循环结束时,将列表列表一次写入输出文件。
  • @OliverW。对平均数据集有很好的建议,但不能扩展到真正的大数据。在其他条件相同的情况下,最好在循环之前打开输出文件一次,因为打开/刷新/关闭文件的开销要少得多。
  • @tdelaney,对于真正大的东西,可以在循环中添加一个检查,看看这个缓冲区(列表)何时“足够大”,然后写入文件(或使用线程做那个检查)。考虑到你的名声,我相信你知道。只需添加它以供将来参考。仍然相信这个问题不适合 SO。
  • @Oliver:你说的是过早优化,万恶之源。 tdelaney 的建议是一个很好的经验法则,因为在提高任何程序的执行速度方面,最小化操作系统调用几乎总是一个好习惯。
  • 我完全误解了这个问题并撤回了我的近距离投票。 @tdelaney,您可能想考虑添加您的评论作为答案,我会赞成。

标签: python loops csv


【解决方案1】:

打开和关闭文件是有代价的:

  • 打开时,必须在文件系统中找到该文件。
  • 关闭时,数据必须从进程刷新到系统
  • 这两个操作都会多次调用操作系统

因此,通常最好在开始处理循环之前打开文件一次,而不是每次循环都重新打开它。

(更新)这是一个示例,它会在执行过程中写入输出文件,但如果在处理过程中出现其他错误,则会将其删除(因此您不会得到看起来像完整结果的部分结果)。

import csv

with open(output_file, 'wb') as f:
    outfileWriter = csv.writer(f, delimiter=',')
    # write header

    try:
        for loop_file in a_list_of_files:
            with open(loop_file) as s:
                # calculate something on the file and write one line to f
                outfileWriter.write(something)
    except:
        # close and delete the file. the ctx manager will try to close
        # the file again, but that's harmless.
        f.close()
        os.remove(output_file)
        raise

【讨论】:

  • 从 cmets 中我了解到,我最好在脚本末尾写一次,而不是每个循环一次。这是正确的吗?
  • 就我个人而言,我会打开 for 循环上方的文件,然后边写边写。我还将代码包装在一个异常处理程序中,该处理程序在出错时删除输出文件,这样我就没有部分结果。这完全取决于您的设计目标,但这是一种正常的方式。我将添加简短的示例。
猜你喜欢
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
相关资源
最近更新 更多