是否有一些工具可以帮助将文件作为数据库中的表处理?

时间:2013-07-05 12:28:42

标签: python database linux csv ipython

我有csv文件,并希望将它们视为数据库的表。当然,我可以将这些文件转换为表格。但是有可能直接在命令行中执行它(以grepheadtailsort和{{1}的方式使用)。

例如,我想awk文件的特定列(由其名称指定),或选择行select某些列具有特定值,或where其中一列列。

2 个答案:

答案 0 :(得分:3)

由于你用python和ipython标记了这个,我假设你想看看从ipython提示符这样做是什么感觉。所以,这是一个简单的CSV文件people.csv:

first,last,age
John,Smith,20
Jane,Smith,19
Frank,Jones,30

现在,这是一个使用它的ipython会话:

In [1]: import csv
In [2]: from operator import *
In [3]: with open('foo.csv') as f: people = list(csv.DictReader(f))
In [4]: [p['age'] for p in sorted(people, key=itemgetter('first')) if p['last'] == 'Smith']
Out[4]: ['19', '20']

将一行CSV文件作为一个dicts列表读入内存需要一行。

鉴于此,您可以对其运行列表推导。

因此,p['age']按名称选择列;另一列的sorted(people, itemgetter('first'))订单,if p['last'] == 'Smith'是where子句。

第二个有点笨拙,但我们可以解决这个问题:

In [5]: def orderby(table, column): return sorted(table, key=itemgetter(column))
In [6]: [p['age'] for p in orderby(people, 'first') if p['last'] == 'Smith']
Out[6]: ['19', '20']

你甚至可以在itertools的帮助下做group by条款,虽然在这里你绝对想要为groupby和聚合定义帮助函数以应用于组,我认为它仍然可能会推动极限......

In [7]: from itertools import *
In [8]: def ilen(iterable): return sum(1 for _ in iterable)
In [9]: def group(table, column): return groupby(table, itemgetter(column))
In [10]: [(k, ilen(g)) for k, g in group(people, 'last')]
Out[10]: [('Smith', 2), ('Jones', 1)]
In [11]: def glen(kg): return kg[0], sum(1 for _ in kg[1])
In [12]: [glen(g) for g in group(people, 'last')]
Out[12]: [('Smith', 2), ('Jones', 1)]
In [13]: def gsum(kg, column): return kg[0], sum(int(x[column]) for x in kg[1])
In [14]: [gsum(g, 'age') for g in group(people, 'last')]
Out[14]: [('Smith', 39), ('Jones', 30)]

但是,有几点要记住:

  • 需要将整个内容读入内存。
  • 没有“索引”。使用数据库,从100000人中选择20个史密斯只需要log(100000)+20步;有一个列表,它需要100000步。
  • 您必须适当地订购操作。如果您想订购,然后过滤行,然后过滤列(如上例所示),一切都很简单;如果你想要一个不同的订单(特别是如果你想按照你没有选择的列进行订购或过滤),你可能需要编写更复杂的理解,而使用数据库则没有任何问题。

请记住,将CSV文件转换为sqlite表只需要大约5行代码。所以,我认为你最好使用一个只运行你的5行Python程序并将你转储到sqlite命令行的脚本。

答案 1 :(得分:2)

由于你用'python'标记了它,python的'pandas'模块提供了一个DataFrame对象,它提供了你在这里想要的功能。使用pandas.read_csv()读取CSV文件。这里提供了有关DataFrames的快速入门:http://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe