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