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

Python 是否有工具可以帮助将文件作为数据库中的表来处理?,python,database,linux,csv,ipython,Python,Database,Linux,Csv,Ipython,我有csv文件,希望将它们视为数据库的表。当然,我可以将这些文件转换为表。但是如果能够直接在命令行中使用grep、head、tail、sort和awk这样的方式,那就太好了 例如,我想选择一个文件中由其名称指定的特定列,或者选择某些列具有特定值的行,或者按其中一列排序。由于您使用python和ipython对其进行了标记,因此我假设您希望从ipython提示符中看到这样做的效果。下面是一个简单的CSV文件people.CSV: first,last,age John,Smith,20 Jane,

我有csv文件,希望将它们视为数据库的表。当然,我可以将这些文件转换为表。但是如果能够直接在命令行中使用grep、head、tail、sort和awk这样的方式,那就太好了


例如,我想选择一个文件中由其名称指定的特定列,或者选择某些列具有特定值的行,或者按其中一列排序。

由于您使用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文件作为dict列表读入内存需要一行

鉴于此,您可以对其运行列表理解

因此,p['age']按名称选择一列;sortedpeople、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']
您甚至可以在提供一些帮助的情况下使用groupby子句,尽管在这里您肯定希望为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名史密斯只需要log100000+20个步骤;对于一个列表,它需要100000个步骤。 您必须适当地安排操作。当你想排序,然后过滤行,然后过滤列,就像上面的例子一样,一切都很简单;如果您想要不同的顺序,特别是如果您想要按未选择的列进行排序或筛选,则可能需要编写更复杂的理解,而使用数据库则根本没有问题。
请记住,将CSV文件转换为sqlite表只需大约5行代码。因此,我认为您最好使用一个脚本,该脚本只运行5行Python程序,并将您转储到sqlite命令行。

既然您使用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文件作为dict列表读入内存需要一行

鉴于此,您可以对其运行列表理解

因此,p['age']按名称选择一列;sortedpeople、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']
您甚至可以在提供一些帮助的情况下使用groupby子句,尽管在这里您肯定希望为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名史密斯只需要log100000+20个步骤;对于一个列表,它需要100000个步骤。 您必须适当地安排操作。当你想排序,然后过滤行,然后过滤列,就像上面的例子一样,一切都很简单;如果您想要不同的顺序,特别是如果您想要按未选择的列进行排序或筛选,则可能需要编写更复杂的理解,而使用数据库则根本没有问题。
请记住,将CSV文件转换为sqlite表只需大约5行代码。因此,我认为您最好使用一个脚本,该脚本只运行5行Python程序,并将您转储到sqlite命令行。

由于您将其标记为“Python”,Python的“pandas”模块提供了一个DataFrame对象,它提供了您在这里似乎想要的功能。使用pandas.read_csv读取csv文件。这里提供了一个关于数据帧的快速入门:

因为您用“python”标记了它,python的“pandas”模块提供了一个数据帧对象,它提供了您在这里想要的功能。使用pandas.read_csv读取csv文件。这里提供了有关数据帧的快速入门知识:

awk是您的朋友。如果你提供了一些输入和期望的输出,你会惊讶地发现有多少魔术可以做到。awk是你的朋友。如果你提供了一些输入和期望的输出,你会惊讶于有多少魔术可以做到。