如何快速搜索Python中的.csv文件

我正在用Python读取一个600万条.csv文件,我希望能够搜索这个文件以查找特定条目。

是否有任何技巧来搜索整个文件? 你应该把整个东西都读成字典吗?还是每次都要进行搜索? 我试着将它加载到字典中,但这花了很长时间,所以我每次都在搜索整个文件,这看起来很浪费。

我可以利用该列表按字母顺序排列吗? (例如,如果搜索词以“b”开头,那么我只从包含以“b”开头的第一个词到包含以“b”开头的最后一个词的那一行)搜索。

我正在使用import csv

(一个侧面的问题:有可能使csv转到文件中的特定行?我想让程序从一个随机行开始)

编辑:我已经有一个.sql文件列表的副本,我怎么能实现它到Python?


如果csv文件没有更改,请将其加载到数据库中,在该数据库中快速简便地进行搜索。 如果你不熟悉SQL,那么你需要重新学习一下。

下面是一个从csv插入到sqlite表格的粗略示例。 示例csv是';' 分隔,并有2列。

import csv
import sqlite3

con = sqlite3.Connection('newdb.sqlite')
cur = con.cursor()
cur.execute('CREATE TABLE "stuff" ("one" varchar(12), "two" varchar(12));')

f = open('stuff.csv')
csv_reader = csv.reader(f, delimiter=';')

cur.executemany('INSERT INTO stuff VALUES (?, ?)', csv_reader)
cur.close()
con.commit()
con.close()
f.close()

你可以将内存映射用于真正的大文件

import mmap,os,re
reportFile = open( "big_file" )
length = os.fstat( reportFile.fileno() ).st_size
try:
    mapping = mmap.mmap( reportFile.fileno(), length, mmap.MAP_PRIVATE, mmap.PROT_READ )
except AttributeError:
    mapping = mmap.mmap( reportFile.fileno(), 0, None, mmap.ACCESS_READ )
data = mapping.read(length)
pat =re.compile("b.+",re.M|re.DOTALL) # compile your pattern here.
print pat.findall(data)

那么,如果你的话不太大(这意味着他们会适应记忆),那么这是一个简单的方法来做到这一点(我假设他们都是单词)。

from bisect import bisect_left

f = open('myfile.csv')

words = []
for line in f:
    words.extend(line.strip().split(','))

wordtofind = 'bacon'
ind = bisect_left(words,wordtofind)
if words[ind] == wordtofind:
    print '%s was found!' % wordtofind

可能需要一分钟才能加载文件中的所有值。 这使用二进制搜索来找到你的话。 在这种情况下,我正在寻找培根(谁不会寻找培根?)。 如果存在重复的值,您可能还想使用bisect_right查找等于您要搜索的值的最右侧元素之外的索引1。 如果您有键:值对,您仍然可以使用它。 你只需要让你的单词列表中的每个对象都是[键,值]的列表。

边注

我不认为你可以非常轻松地在一个csv文件中逐行排队。 你看,这些文件基本上只是长字符串,用 n字符表示新行。

链接地址: http://www.djcxy.com/p/55085.html

上一篇: How do quickly search through a .csv file in Python

下一篇: Save PL/pgSQL output from PostgreSQL to a CSV file