python - 随机访问csv文件内容

标签 python csv file-io

我正在寻找一种以随机方式访问 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/

相关文章:

c - 从文件读取到 LinkedList C 时,最终字段为 NULL

python - 如何在Python中使用xpath访问表值

python - 带日期限制的总信息

php - 通过php将csv从mysql保存到服务器

scala - 当最后一列名称包含空格时,Spark 无法读取 CSV

java - 如何获取JTextArea中的指定行

java - 在 Java 中逐行读取和写入大文件的最快方法

python - 节点的属性是否可以视为Neo4j中特殊类型的节点?

python - 在 Python 中将垂直系列 reshape 为水平系列

python - 使用 for 循环替换 pandas 列每一行中的单元格值