我正在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)
如果pandas读/写是如此直截了当,为什么还要选择csv库?
答案 0 :(得分:1)
你应该使用最适合你的东西! Csv是原生的,因此将代码移动到其他平台或机器非常容易。在某些情况下,这可能是一个优势。但如果你对熊猫感到满意,你一定要用它!
答案 1 :(得分:0)
您拥有的两个程序做的事情非常不同。 pd.read_csv()
将整个文件插入内存,而csv.reader(f)
仅根据需要读取。更等效的比较是pd.read_csv(chunksize=chunksize)
。
pandas版本的问题在于,不能保证在不再需要它时立即清理文件句柄。 Python保证在垃圾回收文件句柄时将关闭文件句柄,但不能保证何时垃圾回收。如果您打开了数千个文件,即使您一次从未拥有多个句柄,也可能会发现自己意外地耗尽了文件句柄。
在使用引用计数的CPython中,这意味着立即进行垃圾回收,这可能不是什么大问题,因为一旦没有更多对文件对象的引用,CPython实际上将关闭文件句柄。但是大多数其他Python实现使用垃圾收集策略,这可能会延迟垃圾收集,直到出现清扫线程。如果您确信您的应用程序只能在CPython中运行,并且您只是在编写短期程序而不会打开太多文件,那么您可以执行reader = csv.reader(open(filename))
。
但是在可能发生上述问题的情况下,当您使用分块读取(处理非常大的文件时需要)时,熊猫版本也不安全。在这种情况下,您也应该使用上下文管理器以确保安全:
for filename in lots_of_files:
with open(filename) as f:
for chunk in pd.read_csv(f, chunksize=chunksize):
process(chunk)
总而言之,使用with语句来关闭文件句柄在大多数情况下是一种学问,直到您需要在可能存在问题的情况下进行工作为止。始终关闭文件句柄是一个好习惯,但是如果您知道程序不会打开多个文件,或者如果您只需要在CPython上运行,那么通常就不必太担心关于它,如果它不会给您带来问题。