Leggendo i nomi di colonna da solo in un file csv

Ho un file csv con le seguenti colonne:

id,nome,età,sesso

Seguita da un sacco di valori per le colonne sopra indicate.
Sto cercando di leggere i nomi di colonna da solo e metterli all’interno di una lista.

Sto usando Dictreader e questo dà i giusti dettagli:

with open('details.csv') as csvfile:
    i=["name","age","sex"]
    re=csv.DictReader(csvfile)
    for row in re:
        for x in i:
            print row[x]

Ma quello che voglio fare è, ho bisogno di una lista di colonne, (la”i” nel caso di cui sopra)per essere analizzato in automatico con l’ingresso csv hardcoding all’interno di un elenco.

with open('details.csv') as csvfile:

    rows=iter(csv.reader(csvfile)).next()
    header=rows[1:]
    re=csv.DictReader(csvfile)
    for row in re:
        print row
        for x in header:

            print row[x]

Questo dà un errore

Keyerrror:'name'

in riga la riga di stampa[x]. Dove sto andando di male? È possibile recuperare i nomi di colonna utilizzando Dictreader? Gentilmente aiuto. Grazie e saluti.

  • penso sia print re[x]
  • Youll ottenere il messaggio di errore: Dictreader esempio non ha l’attributo “getitem
  • Puoi postare alcune righe del file, per vedere come appare?
  • id,name,age,sex 100101,Herbert,21,m 100102,Keith,18,m 100103,Jennifer,15,f
InformationsquelleAutor Tania | 2015-03-03

 

7 Replies
  1. 36

    È possibile leggere l’intestazione utilizzando la next() funzione che restituisce la riga successiva del lettore iterable oggetto come un elenco. quindi è possibile aggiungere il contenuto del file in un elenco.

    import csv
    with open("C:/path/to/.filecsv", "rb") as f:
        reader = csv.reader(f)
        i = reader.next()
        rest = [row for row in reader]

    Ora ho la colonna nomi in lista.

    print i
    >>>['id', 'name', 'age', 'sex']

    Anche notare che reader.next() non funziona in python 3. Invece di utilizzare l’integrato next() per ottenere la prima riga del csv immediatamente dopo la lettura, in questo modo:

    import csv
    with open("C:/path/to/.filecsv", "rb") as f:
        reader = csv.reader(f)
        i = next(reader)
    
        print(i)
        >>>['id', 'name', 'age', 'sex']
    • Grazie per la tua soluzione. Ma voglio accedere solo i nomi di colonna. Suppongo che ho bisogno solo le ultime 3 colonne… ho a che fare con l’indice i questo caso..ad esempio io[0] e così via… È possibile fare questo con dictreader? Posso accedere row[nome] poi. Ho solo bisogno del mio codice per supportare più colonne. e più di gli indici sono preoccupato con i nomi di colonna.
    • Tipo di. Così, per esempio, se si accede names, si desidera recuperare tutti i nomi nel file?
    • Si prega di vedere aggiornato risposta qui sotto. Hai fatto la mia giornata. Grazie 🙂
    • Fresco, scusa non ho capito chiaramente ciò che è necessario. Contento di aver potuto aiutare
    • Sì l’ho calcolato io. Grazie per la soluzione. L’iteratore ha lavorato come un FASCINO.
  2. 59

    Se hai già accettato risposta, ho pensato di aggiungere questo per chiunque sia interessato a una soluzione diversa-

    Attuazione potrebbe essere come segue:

    import csv
    
    with open('C:/mypath/to/csvfile.csv', 'r') as f:
        d_reader = csv.DictReader(f)
    
        #get fieldnames from DictReader object and store in list
        headers = d_reader.fieldnames
    
        for line in d_reader:
            #print value in MyCol1 for each row
            print(line['MyCol1'])

    Sopra, d_reader.fieldnames restituisce un elenco di intestazioni (supponendo che le intestazioni sono nella riga superiore).
    Che permette…

    >>> print(headers)
    ['MyCol1', 'MyCol2', 'MyCol3']

    Se le intestazioni sono in 2 ° fila (con la cima riga è la riga 1), si potrebbe fare come segue:

    import csv
    
    with open('C:/mypath/to/csvfile.csv', 'r') as f:
        #you can eat the first line before creating DictReader.
        #if no "fieldnames" param is passed into
        #DictReader object upon creation, DictReader
        #will read the upper-most line as the headers
        f.readline()
    
        d_reader = csv.DictReader(f)
        headers = d_reader.fieldnames
    
        for line in d_reader:
            #print value in MyCol1 for each row
            print(line['MyCol1'])
    • Questa è una ottima soluzione! 🙂
    • Quando ho “aggiornato” per python3 il fieldnames proprietà restituisce ora None. Secondo la documentazione sembra che dovrebbe funzionare, ma non è così. Per quello che vale. Sto usando python 3.7. Io credo che ci sia stato un cambiamento in quello che il DictReader restituisce in python3.6.
  3. 10

    Il csv.DictReader oggetto espone un attributo chiamato fieldnames, e che è ciò che si desidera utilizzare. Ecco un codice di esempio, seguito da input e di output corrispondente:

    import csv
    file = "/path/to/file.csv"
    with open(file, mode='r', encoding='utf-8') as f:
        reader = csv.DictReader(f, delimiter=',')
        for row in reader:
            print([col + '=' + row[col] for col in reader.fieldnames])

    File di Input contenuti:

    col0,col1,col2,col3,col4,col5,col6,col7,col8,col9
    00,01,02,03,04,05,06,07,08,09
    10,11,12,13,14,15,16,17,18,19
    20,21,22,23,24,25,26,27,28,29
    30,31,32,33,34,35,36,37,38,39
    40,41,42,43,44,45,46,47,48,49
    50,51,52,53,54,55,56,57,58,59
    60,61,62,63,64,65,66,67,68,69
    70,71,72,73,74,75,76,77,78,79
    80,81,82,83,84,85,86,87,88,89
    90,91,92,93,94,95,96,97,98,99

    Uscita di istruzioni di stampa:

    ['col0=00', 'col1=01', 'col2=02', 'col3=03', 'col4=04', 'col5=05', 'col6=06', 'col7=07', 'col8=08', 'col9=09']
    ['col0=10', 'col1=11', 'col2=12', 'col3=13', 'col4=14', 'col5=15', 'col6=16', 'col7=17', 'col8=18', 'col9=19']
    ['col0=20', 'col1=21', 'col2=22', 'col3=23', 'col4=24', 'col5=25', 'col6=26', 'col7=27', 'col8=28', 'col9=29']
    ['col0=30', 'col1=31', 'col2=32', 'col3=33', 'col4=34', 'col5=35', 'col6=36', 'col7=37', 'col8=38', 'col9=39']
    ['col0=40', 'col1=41', 'col2=42', 'col3=43', 'col4=44', 'col5=45', 'col6=46', 'col7=47', 'col8=48', 'col9=49']
    ['col0=50', 'col1=51', 'col2=52', 'col3=53', 'col4=54', 'col5=55', 'col6=56', 'col7=57', 'col8=58', 'col9=59']
    ['col0=60', 'col1=61', 'col2=62', 'col3=63', 'col4=64', 'col5=65', 'col6=66', 'col7=67', 'col8=68', 'col9=69']
    ['col0=70', 'col1=71', 'col2=72', 'col3=73', 'col4=74', 'col5=75', 'col6=76', 'col7=77', 'col8=78', 'col9=79']
    ['col0=80', 'col1=81', 'col2=82', 'col3=83', 'col4=84', 'col5=85', 'col6=86', 'col7=87', 'col8=88', 'col9=89']
    ['col0=90', 'col1=91', 'col2=92', 'col3=93', 'col4=94', 'col5=95', 'col6=96', 'col7=97', 'col8=98', 'col9=99']
  4. 2

    Ringraziare Daniel Jimenez per la sua soluzione perfetta per recuperare i nomi di colonna da solo dal mio csv, ho estendere la sua soluzione per l’utilizzo DictReader in modo che possiamo scorrere le righe con i nomi di colonna come indici. Grazie Jimenez.

    with open('myfile.csv') as csvfile:
    
        rest = []
        with open("myfile.csv", "rb") as f:
            reader = csv.reader(f)
            i = reader.next()
            i=i[1:]
            re=csv.DictReader(csvfile)
            for row in re:
                for x in i:
                    print row[x]
  5. 1

    Io sono solo ricordare come ottenere tutti i nomi di colonna da un file csv.
    Sto usando panda biblioteca.

    Prima leggiamo il file.

    import pandas as pd
    file = pd.read_csv('details.csv')

    Quindi, solo per ottenere tutti i nomi di colonna come una lista da file di input utilizzare:-

    columns = list(file.head(0))
  6. 0

    qui è il codice per stampare solo le intestazioni o le colonne del file csv.

    import csv
    HEADERS = next(csv.reader(open('filepath.csv')))
    print (HEADERS)

    Un altro metodo con i panda

    import pandas as pd
    HEADERS = list(pd.read_csv('filepath.csv').head(0))
    print (HEADERS)
  7. 0

    Come su

    with open(csv_input_path + file, 'r') as ft:
    header = ft.readline() # read only first line; returns string
    header_list = header.split(',')
    # restituisce l’elenco;

    Sto supponendo che il file di input è formato CSV.
    Se si utilizza la panda, ci vuole più tempo se il file è di grandi dimensioni a causa del caricamento di tutti i dati del dataset.

Lascia un commento