python - 是否有工具可以帮助将文件视为数据库中的表?

标签 python database linux csv ipython

我有 csv 文件,想将它们视为数据库的表格。当然我可以将这些文件转换成表格。但是如果有可能直接在命令行中执行它会很好(使用类似 grepheadtailsortawk 的方式)。

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

最佳答案

由于您使用 python 和 ipython 标记了它,我假设您希望在 ipython 提示符下执行此操作会是什么样子。所以,这是一个简单的 CSV 文件 people.csv:

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

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

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']

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)]

但是,有几点需要牢记:

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

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

关于python - 是否有工具可以帮助将文件视为数据库中的表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17488937/

相关文章:

linux nasm 打印多个字符

c - C写的shell只执行一次

python - 在 Python Flask 蓝图中模拟函数

Python BeautifulSoup 选择 div 类

java - 安卓工作室 : app not saving to/reading from database

mysql - 用于根据特定条件计算记录并返回计数的 SQL 脚本

php - 在 Linux 上使用 PHP 启用 LOCAL INFILE

python - 无法导入 cv2

python - python是否有检查对象是否具有属性的简写?

linux - Centos 7 上带有自定义 PGDATA 的 Postgresql 9.3