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。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么只为字符数组重载println方法,而不为字符串、整数等其他数组重载?   java将快速线程返回到池中,而不是等待慢速线程   创建jar文件时java SwingWorker不工作   java如何将依赖注入RabbitListener   java如何在gradle任务中通过scp复制目录?   java在MySql数据库中创建表时,遇到NullPointerException   java HTTP Status 500 Servlet执行引发异常   在JAVA中对arraylist使用继承时出错   java PowerMockito未完成存根异常   如果没有错误/警告增加到某个极限,java是否停止在eclipse中构建项目或使用maven?   java Robolectric如何测试DateFormat。getBestDateTimePattern()   google云平台GCP数据存储Java API,构建一个空值实体   VerifyListener和FocusListener之间的java冲突   安卓是否可以在Java中的另一个方法内部强制调用一个方法?   JavaWindows7、JDK1.8、SpringBoot应用程序JAR在方法安全性方面占用了大量时间。getProviders()返回   Bean提供程序的java错误消息   java Slick动画每帧必须有一个持续时间   java无法在Trie中设置isLeaf标志   java为什么JVM不能创建包含main方法的类的对象,以便从该类访问main方法,如果它具有该类的名称?   java Apache Camel+CXF端点身份验证