Come fare per cercare rapidamente attraverso .il file csv in Python

Sto leggendo un di 6 milioni di voce .file csv con Python, e voglio essere in grado di cercare attraverso questo file per una voce specifica.

Ci sono trucchi per cercare l’intero file? Per leggere il tutto in un dizionario o se si esegue una ricerca ogni volta? Ho cercato di caricarli in un dizionario, ma che ha preso le età, in modo da sto attualmente la ricerca attraverso l’intero file ogni volta che sembra uno spreco.

Potrei utilizzare che l’elenco è in ordine alfabetico? (ad esempio, se la parola di ricerca inizia con la “b” ho solo cercare la riga che include la prima parola che inizia con la “b” per la linea che include l’ultima parola che inizia con “b”)

Sto usando import csv.

(un lato domanda: è possibile fare csv andare a una specifica riga del file? Voglio avviare il programma in una linea casuale)

Edit: ho già una copia della lista .file sql, come potrei implementare che in Python?

Mi piacerebbe importare il file in un database.
Ho dimenticato di dire che io non sono un Pitone esperto con qualsiasi mezzo, in modo un esempio di codice sarebbe molto apprezzato.
Come molte ricerche si esegue ogni esecuzione dello script?
Due programmi, uno è un dizionario di ricerca dove l’utente può interrogare una parola o una parola declinata modulo e l’altro è dove il programma genera in modo casuale una parola specifica forma. Il numero di ricerche dipende dal numero di parole che l’utente vuole cercare di fondo.

OriginaleL’autore Iceland_jack | 2010-02-19

6 Replies
  1. 6

    Se il file csv non è cambiando, carico in un database, per cui la ricerca è facile e veloce. Se non hai familiarità con SQL, è necessario rispolverare che però.

    Qui è un esempio di massima di inserimento da un file csv in una tabella sqlite. Csv di esempio ‘;’ delimitata, e ha 2 colonne.

    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()
    Io avevo sperato io non sarei per utilizzare SQL per fare questo, Python è presumibilmente quasi veloce come il Perl gestione di stringhe? È SQL davvero più veloce? (Io uso Linux quindi, si prega di provare a suggerire di software multipiattaforma)
    com.close() dovrebbe essere con.close()
    Questa non è una questione di perl vs python, stai problema è che siete più volte la lettura di un file di grandi dimensioni. Perl e python poteva farlo allo stesso modo. Un database di dare una migliore interfaccia per l’indicizzazione e la ricerca.
    Io preferisco non usare un database, in quanto non ho familiarità con SQL, non c’è modo per l’attuazione del presente e senza l’utilizzo di SQL e se non c’è – che cosa sistema di gestione di database devo usare? È mySQL buona? E non si carica tutto il file in un database nel tuo esempio, la creazione di 6 milioni di tuple? Non che prendere un sacco di tempo ogni volta che il programma si avvia?
    È piuttosto breve e dolce, esempio. Perché non provare e vedere per quanto tempo la creazione del DB e provare un paio di ricerche? Chissà, forse è la soluzione perfetta per voi

    OriginaleL’autore JimB

  2. 4

    è possibile utilizzare la mappatura della memoria per i file

    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)

    OriginaleL’autore ghostdog74

  3. 1

    Bene, se le vostre parole non sono troppo grandi (nel senso che andrà bene a memoria), quindi qui è un modo semplice per fare questo (sto dando per scontato che sono tutte parole).

    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

    Si potrebbe prendere un minuto per caricare tutti i valori dal file. Questo utilizza il binario di ricerca per trovare le tue parole. In questo caso stavo cercando di pancetta (che non cercare di pancetta?). Se ci sono valori ripetuti si potrebbe anche voler utilizzare bisect_right per trovare l’indice di 1 di là dell’elemento più a destra che è uguale al valore che si sta cercando. È ancora possibile utilizzare questo se si dispone di coppie chiave /valore. Ti basta per rendere ogni oggetto nel vostro elenco di parole di essere un elenco di [chiave, valore].

    Lato Nota

    Non credo che si possa andare da riga a riga in un file csv molto facilmente. Si può vedere, questi file sono fondamentalmente solo stringhe lunghe con \n caratteri che indicano nuove linee.

    OriginaleL’autore Justin Peel

  4. 1

    Si può andare direttamente a una specifica riga del file, perché le linee sono di lunghezza variabile, quindi l’unico modo per sapere quando la linea #n inizia è alla ricerca dei primi n caratteri. E non basta cercare ‘\n’ caratteri, perché CSV permette a capo nelle celle della tabella, quindi è davvero necessario analizzare il file comunque.

    OriginaleL’autore dan04

  5. 0

    la mia idea è di usare python zodb modulo per memorizzare dictionaty tipo di dati e quindi creare un nuovo file csv utilizzando i dati della struttura. fare tutte le operazione in quel momento.

    OriginaleL’autore vicky

  6. 0

    C’è un modo abbastanza semplice per fare questo.A seconda di quante colonne vuoi python per la stampa, quindi potrebbe essere necessario aggiungere o rimuovere alcune delle righe di stampa.

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

    Spero che questo ha aiutato.

    OriginaleL’autore TheOneWhoLikesToKnow

Lascia un commento