对于不是很大的文件,Pytables与CSV

时间:2010-10-26 10:42:56

标签: python csv pytables

我最近遇到了Pytables并发现它非常酷。很明显,对于非常大的数据集,它们优于csv格式。我正在使用python运行一些模拟。输出不是很大,比如200列和2000行。

如果有人对两者都有经验,那么从长远来看,你能否建议哪种格式对于不是很大的数据集会更方便。 Pytables具有数据处理功能和使用Vitables浏览数据,但浏览器没有像Excel那样可用于CSV的功能。同样,如果主要在python中工作,你是否找到一个比另一个更好的导入和导出数据?在文件组织方面更方便吗?对这些问题的任何评论都会有所帮助。

感谢。

6 个答案:

答案 0 :(得分:6)

您是否考虑过Numpy阵列?

当您的数据太大而无法容纳在内存中时,PyTables非常棒,但是a 200字节的8字节浮点矩​​阵只需要大约3MB的内存。所以我认为 PyTables可能有点过分。

您可以使用np.savetxtnp.savez(用于压缩)将numpy数组保存到文件中,并可以使用np.loadtxtnp.load从文件中读取它们。

如果你有许多这样的数组存储在磁盘上,那么我建议使用数据库而不是numpy .npz文件。顺便说一句,要在数据库中存储200x2000矩阵,您只需要3个表列:row,col,value:

import sqlite3
import numpy as np

db = sqlite3.connect(':memory:')
cursor = db.cursor()
cursor.execute('''CREATE TABLE foo
                  (row INTEGER,
                   col INTEGER,
                   value FLOAT,
                   PRIMARY KEY (row,col))''')
ROWS=4
COLUMNS=6
matrix = np.random.random((ROWS,COLUMNS))
print(matrix)
# [[ 0.87050721  0.22395398  0.19473001  0.14597821  0.02363803  0.20299432]
#  [ 0.11744885  0.61332597  0.19860043  0.91995295  0.84857095  0.53863863]
#  [ 0.80123759  0.52689885  0.05861043  0.71784406  0.20222138  0.63094807]
#  [ 0.01309897  0.45391578  0.04950273  0.93040381  0.41150517  0.66263562]]

# Store matrix in table foo
cursor.executemany('INSERT INTO foo(row, col, value) VALUES (?,?,?) ',
                   ((r,c,value) for r,row in enumerate(matrix) 
                                for c,value in enumerate(row)))

# Retrieve matrix from table foo
cursor.execute('SELECT value FROM foo ORDER BY row,col')
data=zip(*cursor.fetchall())[0]
matrix2 = np.fromiter(data,dtype=np.float).reshape((ROWS,COLUMNS))
print(matrix2)
# [[ 0.87050721  0.22395398  0.19473001  0.14597821  0.02363803  0.20299432]
#  [ 0.11744885  0.61332597  0.19860043  0.91995295  0.84857095  0.53863863]
#  [ 0.80123759  0.52689885  0.05861043  0.71784406  0.20222138  0.63094807]
#  [ 0.01309897  0.45391578  0.04950273  0.93040381  0.41150517  0.66263562]]

如果你有许多这样的200x2000矩阵,你只需要一个表列来指定哪个矩阵。

答案 1 :(得分:2)

就导入/导出而言,PyTables使用名为HDF5的标准化文件格式。许多科学软件包(如MATLAB)都内置了对HDF5的支持,而C API并不可怕。因此,您需要从其中一种语言导出或导入其中的任何数据都可以保存在HDF5文件中。

PyTables确实添加了自己的一些属性,但这些属性不会对你造成伤害。当然,如果将Python对象存储在文件中,您将无法在其他地方读取它们。

CSV文件的一个好处是它们是人类可读的。但是,如果您需要在其中存储除简单数字以外的任何内容并与他人交流,那么您将遇到问题。我从其他组织的人那里收到CSV文件,我注意到人类并不擅长确保字符串引用等内容正确完成。 Python的CSV解析器和它一样灵活,这很好。另一个问题是浮点数不能使用十进制格式精确地存储在文本中。但这通常足够好。

答案 2 :(得分:2)

PyTables的一大优点是元数据的存储,如变量等。 如果您使用不同的参数更频繁地运行模拟,则将结果存储为h5文件中的数组条目。

我们使用它来存储测量数据+实验脚本以获取数据,因此它是全部自包含的。

BTW:如果您需要快速查看hdf5文件,可以使用HDFView。这是一个免费的HDFGroup Java应用程序。它很容易安装。

答案 3 :(得分:1)

我认为很难比较pytables和csv .. pyTables是一种数据结构,而CSV是数据的交换格式。

答案 4 :(得分:1)

这实际上与我提供的关于读取/编写带有numpy的csv文件的另一个答案非常相关:

Python: how to do basic data manipulation like in R?

你应该肯定使用numpy,无论别的什么!索引的易用性等远远超过额外依赖的成本(我认为是这样)。当然,PyTables也依赖于numpy。

否则,它实际上取决于您的应用程序,硬件和受众。我怀疑,与PyTables相比,读取你所谈论的大小的csv文件在速度方面无关紧要。但如果这是一个问题,写一个基准!读取和写入一些随机数据100次。或者,如果读取时间更重要,则写入一次,读取100次等等。

我强烈怀疑PyTables会胜过SQL。 SQL将在复杂的多表查询上发挥作用(特别是如果你经常进行相同的查询),但即使在单表(所谓的“非规范化”)表查询中,pytables在速度方面也很难被击败。我无法找到这方面的参考资料,但是如果你在这里挖掘链接,你可以挖掘一些东西:

http://www.pytables.org/moin/HowToUse#HintsforSQLusers

我猜这个阶段的执行性能与编码器性能相比会显得苍白无力。所以,最重要的是,选择对你最有意义的东西!

其他要点:

与SQL一样,PyTables具有撤消功能。 CSV文件不具有此功能,但您可以将它们保留在版本控制中,并且VCS不需要太智能(CSV文件是文本)。

在相关的说明中,CSV文件将比二进制格式大得多(你当然可以为此编写自己的测试)。

答案 5 :(得分:0)

这些不是“独家”选择。

你需要两者。

CSV只是一种数据交换格式。如果使用pytables,则仍需要以CSV格式导入和导出。