Python3类,用于CSV/文本文件的内存高效导航。
csvnav的Python项目详细描述
CSVNAV:python3类,用于CSV/文本文件的内存高效导航
此软件包可与pip一起安装:
pip install csvnav
或者下载此回购并使用设置工具:
^{pr2}$从csvnav
目录中运行。在
文件csvnav.py
是一个包含类Navigator
的python模块。实例化时,Navigator
将打开一个给定的路径,然后存储指向打开的文件中每行位置的指针。在最简单的情况下,可以使用类似于列表的实例化。例如,如果我有一个文件“库存.csv“包含以下CSV数据:
time,product,quantity
5,tire,4
8,sparkplug,20
2,battery,120
10,tire,2
11,tire,3
30,sparkplug,35
我可以实例化类并按索引查询行:
fromcsvnavimportNavigatornav=Navigator('./inventory.csv',header=True,delimiter=',')print(nav[0])print(nav[2])print(nav.size(force=True))nav.close()
其中输出为:
{'product': 'tire', 'quantity': '4', 'time': '5'}
{'product': 'battery', 'quantity': '120', 'time': '2'}
6
注意,可以通过调用Navigator.size(force=True)
来打印数据行的数量(不包括任何跳过的行和头)。在这种情况下,force=True
意味着即使文件中的最后一行尚未被访问,也将确定文件中的数据行数。如果访问了最后一行,force=False
将返回相同的结果。但是,如果最后一行还没有被访问,force=False
将返回None
。另一件要注意的事是,这些行作为字典返回。只要Navigator.header
包含一个列名列表(当header=True
实例化时或当列名与Navigator.set_header()
方法一起提供时,从CSV文件的第一行自动完成),这些行将作为字典返回。否则,这些行将作为列表返回。例如,如果“库存.csv“没有标题,则输出将为:
['5', 'tire', '4']
['2', 'battery', '120']
6
Navigator
类也是iterable,将按顺序遍历行:
forrowinnav:print(row)
给出输出(假设我们有一个标题):
{'time': '5', 'product': 'tire', 'quantity': '4'}
{'time': '8', 'product': 'sparkplug', 'quantity': '20'}
{'time': '2', 'product': 'battery', 'quantity': '120'}
{'time': '10', 'product': 'tire', 'quantity': '2'}
{'time': '11', 'product': 'tire', 'quantity': '3'}
{'time': '30', 'product': 'sparkplug', 'quantity': '35'}
如果我们只想遍历与条件匹配的行子集,可以使用Navigator.filter
方法:
fromcsvnavimportNavigatornav=Navigator('./inventory.csv',header=True,delimiter=',')defwhen_few_tires(row):ifrow['product']=='tire'andint(row['quantity'])<=3:returnTrueelse:returnFalseforrowinnav.filter(when_few_tires):print(row)nav.close()
将产生输出:
{'time': '10', 'product': 'tire', 'quantity': '2'}
{'time': '11', 'product': 'tire', 'quantity': '3'}
该类的另一个用法是按列名分组指针(假设设置了Navigator.header
)。这可以用Navigator.register
方法来完成。
下面的代码将按产品对行进行分组,并说明如何访问这些数据:
fromcsvnavimportNavigatornav=Navigator('./inventory.csv',header=True,delimiter=',')nav.register('product')# can also provide a list of columns to register eachprint(nav.fields)print(nav.keys('product'))fork,vinnav.items('product'):print(k,list(v))nav.close()
将打印出以下组(dict或list的列表):
dict_keys(['product'])
dict_keys(['tire', 'sparkplug', 'battery'])
tire [{'time': '5', 'product': 'tire', 'quantity': '4'}, {'time': '10', 'product': 'tire', 'quantity': '2'}, {'time': '11', 'product': 'tire', 'quantity': '3'}]
sparkplug [{'time': '8', 'product': 'sparkplug', 'quantity': '20'}, {'time': '30', 'product': 'sparkplug', 'quantity': '35'}]
battery [{'time': '2', 'product': 'battery', 'quantity': '120'}]
注意,然后通过两个“索引”访问组,即列名和键。在
Navigator
类应该是线程安全的,并且可以在线程之间共享实例。Navigator
还有一些我在这里没有描述的功能,但这涵盖了基本的功能。有关详细信息,请参阅Navigator
类的各种方法的docstring。在
- 项目
标签: