【问题标题】:Best way to read and write to csv files: pandas functions vs csv library?读取和写入 csv 文件的最佳方法:pandas 函数与 csv 库?
【发布时间】:2015-08-18 04:38:15
【问题描述】:

我正在 Udacity 上做一些练习。

处理 csv 文件的 pandas 库看起来超级直观。将 pandas 导入为 pd 后,我可以这样做:

读取文件

pd.read_csv("file_path")

写入文件

pd.to_csv("file name")

相比之下,如果我导入 csv 库,代码似乎不直观。我必须这样做:

读取文件

with open("file_path", 'rb') as f:
            reader = csv.reader(f)

写入文件

with open("file name", 'wb') as f:
    writer = csv.writer(f)

如果 pandas 读/写这么简单,我为什么要选择 csv 库?

【问题讨论】:

    标签: python csv


    【解决方案1】:

    您应该使用最适合您的方法! Csv 是原生的,因此很容易将您的代码移动到其他平台或机器上。在某些情况下,这可能是一个优势。但是,如果您对 panda 感到满意,则绝对应该使用它!

    【讨论】:

      【解决方案2】:

      您拥有的两个程序正在做非常不同的事情。 pd.read_csv() 将整个文件放入内存中,而 csv.reader(f) 仅在需要时读取。更等效的比较是pd.read_csv(chunksize=chunksize)

      pandas 版本的问题在于,它不能保证在您不再需要文件句柄时立即清理它。 Python 保证当文件句柄被垃圾回收时它会关闭文件句柄,但它不保证 when 垃圾回收发生。如果您打开数千个文件,您可能会发现自己的文件句柄意外用完,即使您一次只有几个句柄。

      在使用引用计数的 CPython 中,这意味着垃圾回收是即时的,这可能不是什么大问题,因为一旦不再引用文件对象,CPython 实际上就会关闭文件句柄。但大多数其他 Python 实现使用垃圾收集策略,这可能会延迟垃圾收集,直到清扫线程出现。如果您确信您的应用程序只能在 CPython 中运行,并且您只是在编写不会打开太多文件的短期程序,那么您可以使用 reader = csv.reader(open(filename))

      但是在可能出现上述问题的情况下,当您使用分块读取(处理非常大的文件时需要)时,pandas 版本也不安全。在这种情况下,您也应该使用上下文管理器以确保安全:

      for filename in lots_of_files:
          with open(filename) as f:
              for chunk in pd.read_csv(f, chunksize=chunksize):
                  process(chunk)
      

      总而言之,使用 with 语句关闭文件句柄主要是迂腐,直到您需要在可能出现问题的情况下工作。始终关闭文件句柄是一个好习惯,但是如果您知道您的程序不会打开多个文件,或者如果您知道您只需要在 CPython 上运行,您通常不需要太担心如果它不会给您带来问题,请考虑它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-04
        • 1970-01-01
        • 2022-01-24
        • 2019-01-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多