我正在阅读带有Python的600万条.csv文件,我希望能够在此文件中搜索特定条目。
搜索整个文件有什么技巧吗?你应该把整篇文章读成字典还是每次都要进行搜索?我尝试将它加载到字典中,但这花了很长时间,所以我每次都在搜索整个文件,这似乎很浪费。
我是否可以利用该列表按字母顺序排列? (例如,如果搜索词以“b”开头,我只从包含以“b”开头的第一个单词的行搜索到包含以“b”开头的最后一个单词的行
我正在使用import csv
。
(一个附带问题:可以让csv
转到文件中的特定行吗?我想让程序以随机行开头)
编辑:我已经将该列表的副本作为.sql文件,我该如何将其实现为Python?
答案 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])
我希望这能帮到你。