读取和写入csv文件的最佳方式:pandas函数vs csv库



我在Udacity上做一些练习。

使用pandas库处理csv文件似乎超级直观。在将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)

为什么我要选择csv库如果如果熊猫读/写是如此简单?

你应该使用最适合你的!Csv是原生的,因此将代码移到其他平台或机器上非常容易。在某些情况下,这可能是一个优势。但如果你喜欢熊猫,你绝对应该使用它!

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

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

在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-statement来关闭文件句柄是一种迂腐的做法,直到你需要在可能出现问题的情况下工作。这是一个很好的做法,总是关闭你的文件句柄,但如果你知道你的程序不会打开多个文件,或者如果你知道你只需要在CPython上运行,你通常不需要担心太多,如果它不会给你带来问题。

最新更新