2011-04-19 77 views
6

我在一个非常喜欢使用.csv文件进行数据存储的项目。我发现使用.csv存在很多问题,特别是存储关系数据。解析.csv通常是pain,特别是在使用ad-hoc列分配时。什么是以.csv格式存储文件的一些“主流”轻量级替代品?

我主张使用XML和最小数据库,如SQLite,但我正在寻找“更快,更好,更便宜”的替代方案。

什么是.csv文件的其他“主流”轻量级替代品?

另外,如何CouchDB。它在轻量级方面与SQLite相比如何?

编辑:我错过了。这个问题已被问到before

回答

3

我会在那里争论不是直接替换CSV文件。 CSV是一种平面文件索引导向格式。无论你用管道还是其他东西替换逗号都没关系。规则略有不同,这也是一样的。这就是说,我经常选择SQLite时,我的控制中的数据是

使用SQLite始终适用于使用相同的工具,可以用作专门的商店或关系模型,对“独立的”RDBMS有“升级”计划,可免费提供DQL(这对我来说是一个很大的优势)等等。除非空间是真正的问题,或者不支持数据访问,为什么不呢? (现代的Firefox也使用SQLite)。 (还有一些对象数据库,比如DB4O,甚至更简单的键/值分层存储等等。不要说SQLite是获得微观/数据关系的唯一方法,嵌入式数据库。)

一个不好说的是,XML是需要特殊工具(sqlite/adapter)的。 XML虽然不是人性化程度最高的格式,但可以在记事本中进行编辑。另外,除了标记/数据本身,XML中没有额外的开销(碎片或结构),并且XML通常可以很好地压缩。也有很多库将整个对象图映射到XML(并因此保持关系),因此这可能是一个很好的功能。

其他格式,如JSON也在那里 - 但如果格式不透明,那么它不会真正影响XML(它更多的是工具支持问题)。

所以...... “这取决于”。

0

XML被设计为主流,relativey“轻量级”。 JSON是另一个流行的选择,但更适合对象建模而不是数据存储。

MySQL是一个不错的选择,如果你需要的关系查询功能。

+4

我想很多人会说,XML是非常沉重的。 JSON的设计是因为XML的重量... – 2011-04-20 05:54:44

0

这是所有关于用例。

我的经验法则是:如果两个数据之间存在依赖或关系,则使用SQLite;如果只是平面数据文件,请使用CSV(或其他“平面”格式)。最简单的方法就是最可靠的解决方案。

(注:确保CSV很好地形成。没有人喜欢不得不围绕糟糕的CSV实现进行攻击。)

1

看起来像YAML与XML等格式相比相对较小,但比JSON(它是超集)略胜一筹。这是我会考虑的另一个候选人。

1

如果不需要并发写入,HDF5是存储大型表格数据集的好选择。

在Python中,Pandas + PyTables非常容易使用。从熊猫documentation 例子:

In [259]: store = HDFStore('store.h5') 

In [260]: print(store) 
<class 'pandas.io.pytables.HDFStore'> 
File path: store.h5 
Empty 
Objects can be written to the file just like adding key-value pairs to a dict: 

In [261]: np.random.seed(1234) 

In [262]: index = date_range('1/1/2000', periods=8) 

In [263]: s = Series(randn(5), index=['a', 'b', 'c', 'd', 'e']) 

In [264]: df = DataFrame(randn(8, 3), index=index, 
    .....:    columns=['A', 'B', 'C']) 
    .....: 

In [265]: wp = Panel(randn(2, 5, 4), items=['Item1', 'Item2'], 
    .....:   major_axis=date_range('1/1/2000', periods=5), 
    .....:   minor_axis=['A', 'B', 'C', 'D']) 
    .....: 

# store.put('s', s) is an equivalent method 
In [266]: store['s'] = s 

In [267]: store['df'] = df 

In [268]: store['wp'] = wp 

# the type of stored data 
In [269]: store.root.wp._v_attrs.pandas_type 
Out[269]: 'wide' 

In [270]: store 
Out[270]: 
<class 'pandas.io.pytables.HDFStore'> 
File path: store.h5 
/df   frame  (shape->[8,3]) 
/s    series  (shape->[5])  
/wp   wide   (shape->[2,5,4]) 
相关问题