我正在寻找一种以随机方式访问csv文件的单元格的方法。如果我使用Python的csv模块,我只能遍历所有相当慢的行。我还应该补充一点,该文件非常大(> 100MB),而且我的响应时间很短。
我可以将文件预处理为不同的数据格式,以便更快地进行行/列访问。也许有人之前已经这样做了,可以分享一些经验。
背景:
我想在Web服务器提供的屏幕上显示csv的摘录(取决于滚动位置)。保存文件不在内存中。
答案 0 :(得分:4)
我发现SQLite很适合这种事情。它很容易设置,您可以在本地存储数据,但您也可以更轻松地控制您选择的内容而不是csv文件,并且您可以添加索引等。
还有一个用于将csv文件加载到表中的内置工具:http://www.sqlite.org/cvstrac/wiki?p=ImportingFiles。
如果您想了解有关SQLite路线的更多详情,请告知我们,例如如何创建表格,加载数据或从Python查询数据。
SQLite将.csv文件加载到表
的说明要创建数据库文件,您只需在打开SQLite时添加所需的文件名作为参数。从命令行导航到包含csv文件的目录(我假设您希望SQLite .db文件包含在同一个目录中)。如果使用Windows,则将SQLite添加到PATH环境变量(如果尚未完成)(如果需要,请指示here)并按如下方式打开SQLite,并为您提供数据库文件的名称参数:/ p>
sqlite3 example.db
输入以下命令检查数据库文件是否已创建:
.databases
创建一个表来保存数据。我在这里使用一个简单客户表的示例。如果任何列的数据类型不一致,请使用text:
create table customers (ID integer, Title text, Forename text, Surname text, Postcode text, Addr_Line1 text, Addr_Line2 text, Town text, County text, Home_Phone text, Mobile text, Comments text);
指定要使用的分隔符:
.separator ","
发出导入数据的命令,sytnax采用.import filename.ext table_name
形式,例如:
.import cust.csv customers
检查数据是否已加载:
select count(*) from customers;
为可能要过滤的列添加索引(完整语法描述为here),例如:
create index cust_surname on customers(surname);
现在,您应该在对任何索引列进行过滤时快速访问数据。要让SQLite使用.exit
,要使用.help
获取其他有用的非SQL命令的列表。
Python替代
或者,如果您想坚持使用纯Python并预处理文件,那么您可以将数据加载到字典中,这样可以更快地访问数据,因为字典键的行为类似于索引,这意味着您可以访问与键快速关联的值,无需逐个浏览记录。我需要输入数据的更多详细信息以及查找将基于哪些字段,以提供有关如何实现此信息的更多详细信息。
但是,除非您事先知道何时需要数据(为了能够在请求数据之前预处理文件),否则每次仍然会有将文件从磁盘加载到内存的开销你跑这个。根据您的确切用法,这可能使数据库解决方案更合适。