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

时间:2010-02-19 20:51:01

标签: python dictionary csv large-files

我正在阅读带有Python的600万条.csv文件,我希望能够在此文件中搜索特定条目。

搜索整个文件有什么技巧吗?你应该把整篇文章读成字典还是每次都要进行搜索?我尝试将它加载到字典中,但这花了很长时间,所以我每次都在搜索整个文件,这似乎很浪费。

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

我正在使用import csv

(一个附带问题:可以让csv转到文件中的特定行吗?我想让程序以随机​​行开头)

编辑:我已经将该列表的副本作为.sql文件,我该如何将其实现为Python?

6 个答案:

答案 0 :(得分:6)

如果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()

答案 1 :(得分:4)

您可以将内存映射用于非常大的文件

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)

答案 2 :(得分:1)

好吧,如果你的话不是太大(意味着它们会适合记忆),那么这是一个简单的方法(我假设它们都是单词)。

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,该索引等于您要搜索的值。如果你有key:value对,你仍然可以使用它。您只需要将单词列表中的每个对象都设为[键,值]列表。

旁注

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

答案 3 :(得分:1)

您不能直接转到文件中的特定行,因为行是可变长度的,因此知道行#n启动的唯一方法是搜索前n个换行符。仅仅查找'\ n'字符是不够的,因为CSV允许表格单元格中的换行符,所以你真的必须解析文件。

答案 4 :(得分:0)

我的想法是使用python zodb模块存储dictionaty类型数据,然后使用该数据结构创建新的csv文件。那时做你所有的操作。

答案 5 :(得分:0)

有一种相当简单的方法。根据你想要python打印的列数,你可能需要添加或删除一些打印行。

import csv
search=input('Enter string to search: ')
stock=open ('FileName.csv', 'wb')
reader=csv.reader(FileName)
for row in reader:
    for field in row:
        if field==code:
            print('Record found! \n')
            print(row[0])
            print(row[1])
            print(row[2])

我希望这能帮到你。