我有 csv 文件,并希望将它们视为数据库表。当然,我可以将这些文件转换成表格。但是如果有可能直接在命令行中执行它会很好(以类似grep
, head
,tail
和sort
的awk
方式使用)。
例如,我想select
选择文件的特定列(由其名称给出),或选择where
某些列具有某些值的行,或order by
其中一个列。
既然你用 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 文件作为字典列表读入内存需要一行。
鉴于此,您可以在其上运行列表推导。
因此,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']
您甚至可以group by
在 的帮助下创建子句itertools
,尽管在这里您肯定希望为 groupby 和应用于组的聚合定义辅助函数,我认为它仍然可能有点突破限制......</p >
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)]
但是,有几点需要记住:
请记住,将 CSV 文件转换为 sqlite 表只需大约 5 行代码。所以,我认为你最好使用一个只运行你的 5 行 Python 程序并将你转储到 sqlite 命令行的脚本。
由于您使用 'python' 标记了它,python 的 'pandas' 模块提供了一个 DataFrame 对象,该对象提供了您似乎想要的功能。使用 pandas.read_csv() 读取 CSV 文件。此处提供了有关 DataFrames 的快速入门:http: //pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe