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