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

Cur*_*arn 7 python csv pytables

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

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

谢谢.

unu*_*tbu 6

你考虑过Numpy阵列吗?

当你的数据太大而无法容纳在内存中时,PyTables很棒,但是一个200字节的8字节浮点矩​​阵只需要大约3MB的内存.所以我觉得PyTables可能有点矫枉过正.

您可以使用保存numpy的阵列到文件np.savetxtnp.savez(压缩),并可以从文件中读取与他们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]]
Run Code Online (Sandbox Code Playgroud)

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