Cómo buscar rápidamente a través de un archivo .csv en Python

Estoy leyendo un archivo .csv de 6 millones de entradas con Python, y quiero poder buscar en este archivo una entrada en particular.

¿Hay algún truco para buscar el archivo completo? ¿Debería leer todo en un diccionario o debería realizar una búsqueda cada vez? Intenté cargarlo en un diccionario, pero eso me llevó mucho tiempo, por lo que actualmente estoy buscando en todo el archivo cada vez que parece un desperdicio.

¿Podría posiblemente utilizar que la lista está ordenada alfabéticamente? (por ejemplo, si la palabra de búsqueda comienza con “b”, solo busco desde la línea que incluye la primera palabra que comienza con “b” hasta la línea que incluye la última palabra que comienza con “b”)

Estoy usando import csv .

(una pregunta secundaria: ¿es posible hacer que csv vaya a una línea específica en el archivo? Quiero que el progtwig comience en una línea aleatoria)

    Edición: Ya tengo una copia de la lista como archivo .sql también, ¿cómo podría implementar eso en Python?

    Si el archivo csv no está cambiando, cárguelo en una base de datos, donde la búsqueda es rápida y fácil. Si no estás familiarizado con SQL, tendrás que repasar eso.

    Aquí hay un ejemplo aproximado de inserción de un csv en una tabla sqlite. Ejemplo csv es ‘;’ Delimitado, y tiene 2 columnas.

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

    Puedes usar mapeo de memoria para archivos realmente grandes

     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) 

    Bueno, si sus palabras no son demasiado grandes (lo que significa que cabrán en la memoria), aquí hay una forma sencilla de hacerlo (supongo que todas son palabras).

     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 

    Puede demorar un minuto cargar todos los valores del archivo. Esto utiliza la búsqueda binaria para encontrar sus palabras. En este caso estaba buscando tocino (¿quién no buscaría tocino?). Si hay valores repetidos, es posible que también desee utilizar bisect_right para encontrar el índice de 1 más allá del elemento más a la derecha que es igual al valor que está buscando. Aún puedes usar esto si tienes clave: pares de valores. Solo tendrá que hacer que cada objeto en su lista de palabras sea una lista de [clave, valor].

    Nota al margen

    No creo que realmente pueda ir de línea a línea en un archivo csv muy fácilmente. Verás, estos archivos son básicamente cadenas largas con \ n caracteres que indican nuevas líneas.

    No puede ir directamente a una línea específica en el archivo porque las líneas son de longitud variable, por lo que la única forma de saber cuándo comienza la línea #n es buscar las primeras n líneas nuevas. Y no es suficiente buscar los caracteres ‘\ n’ porque CSV permite nuevas líneas en las celdas de la tabla, por lo que realmente tiene que analizar el archivo de todos modos.

    mi idea es usar el módulo zodb de Python para almacenar datos de tipo dictionaty y luego crear un nuevo archivo csv usando esa estructura de datos. Haz todas tus operaciones en ese momento.

    Hay una forma bastante simple de hacer esto. Dependiendo de cuántas columnas desee que Python imprima, es posible que deba agregar o eliminar algunas de las líneas de impresión.

     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]) 

    Espero que esto haya podido ayudar.