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

如何在Python中快速搜索.csv文件,python,dictionary,csv,large-files,Python,Dictionary,Csv,Large Files,我正在用Python读取一个600万条目的.csv文件,我希望能够在该文件中搜索特定条目 有什么技巧可以搜索整个文件吗?你应该把整件事读进字典还是每次都要查?我试着将它加载到字典中,但这需要很长时间,所以我现在每次都在搜索整个文件,这似乎是浪费时间 我可以利用这个列表是按字母顺序排列的吗?(例如,如果搜索词以“b”开头,我仅从包含以“b”开头的第一个词的行搜索到包含以“b”开头的最后一个词的行) 我正在使用导入csv (附带问题:可以使csv转到文件中的特定行吗?我想使程序从随机行开始) 编辑:

我正在用Python读取一个600万条目的.csv文件,我希望能够在该文件中搜索特定条目

有什么技巧可以搜索整个文件吗?你应该把整件事读进字典还是每次都要查?我试着将它加载到字典中,但这需要很长时间,所以我现在每次都在搜索整个文件,这似乎是浪费时间

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

我正在使用
导入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()

好吧,如果你的单词不是太大(这意味着它们将适合记忆),那么这里有一个简单的方法来做到这一点(我假设它们都是单词)

加载文件中的所有值可能需要一分钟的时间。这将使用二进制搜索来查找单词。在这种情况下,我在找培根(谁不找培根?)。如果存在重复的值,您可能还希望使用bisect_right来查找与您正在搜索的值相等的最右边元素之外的索引1。如果有键:值对,仍然可以使用此选项。您只需将单词列表中的每个对象设置为[key,value]列表

旁注


我不认为在csv文件中可以很容易地从一行转到另一行。您可以看到,这些文件基本上只是长字符串,带有\n个字符,表示新行。

您可以对真正大的文件使用内存映射

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)

您不能直接转到文件中的特定行,因为行的长度是可变的,所以知道第n行何时开始的唯一方法是搜索前n个换行符。仅仅查找“\n”字符是不够的,因为CSV允许在表格单元格中使用换行符,所以您确实需要解析文件。

我的想法是使用python zodb模块存储字典类型的数据,然后使用该数据结构创建新的CSV文件。此时请执行所有操作。

有一种相当简单的方法可以做到这一点。根据希望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])

我希望这能有所帮助。

我会先将文件导入数据库。我忘了提到我不是Python专家,因此非常感谢提供一个代码示例。每次运行脚本时,您将执行多少次查找?两个程序,一种是字典搜索,用户可以在其中查询单词或词形变化,另一种是程序随机生成特定单词形式。查找的数量基本上取决于用户想要查找的单词数量。我有点希望不必使用SQL来完成这项工作,Python处理字符串的速度应该和Perl一样快?SQL真的更快了吗?(我使用的是Linux,所以请尝试建议使用跨平台软件)com.close()应该是con.close()@Baldur-这不是perl和python的问题,问题是您重复读取一个大文件。Perl和python将以同样的方式完成。数据库只是为您提供了一个更好的索引和搜索界面。我不想使用数据库,因为我不熟悉SQL,没有SQL就无法很好地实现这一点吗?如果没有,我应该使用什么数据库管理系统?mySQL好吗?在您的示例中,您不是将整个文件加载到数据库中,创建了600万个元组吗?这不是每次程序启动时都会占用很多时间吗?@Baldur这是一个非常简短的例子。为什么不试试,看看创建数据库需要多长时间,然后再尝试几次搜索呢?谁知道呢,也许这对你来说是个完美的解决方案问题是快速搜索,而不是线性搜索!你回答蛮力,这不符合快速!
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])