Pagina 1 di 1

[Risolto] basi lettura csv (python)

Inviato: lunedì 10 aprile 2017, 19:50
da Atomo
Salve
premesso che di programmazione so davvero pochissimo ma che ogni tanto mi tocca fare qualcosa, ho un problema
mi trovo a dover leggere tramite python il contenuto di una serie di file .csv e mi hanno suggerito la libreria pandas, ma non l'ho mai usata e non è che ci sto capendo gran che. Ogni file contiene due colonne, si trovano in una certa cartella, che gli do io e per ciascuno di essi volevo leggere il contenuto (come se fossero due colonne separate). Avevo pensato di iniziare così

Codice: Seleziona tutto

import os
import pandas
folder_path = input("dove si trovano i tuoi file? ")
for data_file in sorted(os.listdir(folder_path)):

ma poi non ho idea di come fargli leggere il contenuto, nel senso che in due ci eravamo pure riusciti ma mi pare che alla fine tirava fuori una sola colonna (le due affiancate in un'unica cella e separate da un punto e virgola).
Se avete pazienza, usate codice semplice anche se ci dovessero volere 50 passaggi in più se no mi perdo per strada e non capisco :lol:

Seconda cosa io attualmente sto lavorando da Windows (lo strumento che genera i file csv funziona solo li) ma questo breve programmino dovrà funzionare anche su sistemi Linux se riusciamo a farci dare i file. Eventualmente non devo cambiare nulla?

------------------------
-modifica 1:
Per prenderci la mano ho tolto tutti i csv e ne ho messo solo uno chiamato prova.csv che contiene colonna1,colonna3,colonna3
e ho deciso di partire senza pandas e poi si vedrà, per come ho capito io la sintassi mi è venuto da scrivere:

Codice: Seleziona tutto

with open(data_file) as csvfile:
    read_csv = csv.reader(csvfile, delimiter=',')
    for row in read_csv:
        print(row)
ma quello che salta fuori è:

Codice: Seleziona tutto

FileNotFoundError: [Errno 2] No such file or directory: 'prova.csv'
???

Re: basi lettura csv (python)

Inviato: martedì 11 aprile 2017, 16:54
da melfnt
Per leggere un file csv prova ad utilizzare la funzione read_csv (la documentazione è qui).
Poi, a seconda di quello che devi fare puoi manipolare il dataframe che ti restituisce.

Se lavori su windows, molto probabilmente il tool salverà i file csv con il terminatore di riga di windows, puoi settare il parametreo line_terminator per far parsare correttamente i file csv a pandas.

(;

Re: basi lettura csv (python)

Inviato: martedì 11 aprile 2017, 17:31
da Atomo
ho provato anche con:

Codice: Seleziona tutto

for data_file in sorted(os.listdir(folder_path)):
    open_csv = pd.read_csv(data_file, delimiter=',')
giusto per vedere se lo legge e basta senza dare errori, ma mi risponde:

Codice: Seleziona tutto

FileNotFoundError: File b'prova.csv' does not exist
a essere precisi l'errore completo dopo aver inserito il percorso del file e premuto invio è (le parole fra parentesi [quadre], sono modifiche per eliminare informazioni personali:

Codice: Seleziona tutto

Traceback (most recent call last):
  File "C:\Users\[utente]\Documents\[cartella personale]\Python\fabbricante\programmadiprova.py", line 51, in <module>
    main()
  File "C:\Users\[utente]\Documents\[cartella personale]\Python\fabbricante\programmadiprova.py", line 43, in main
    open_csv = pd.read_csv(data_file, delimiter=',')
  File "C:\Users\[utente]\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\io\parsers.py", line 646, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Users\[utente]\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\io\parsers.py", line 389, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "C:\Users\[utente]\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\io\parsers.py", line 730, in __init__
    self._make_engine(self.engine)
  File "C:\Users\[utente]\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\io\parsers.py", line 923, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "C:\Users\[utente]\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\io\parsers.py", line 1390, in __init__
    self._reader = _parser.TextReader(src, **kwds)
  File "pandas\parser.pyx", line 373, in pandas.parser.TextReader.__cinit__ (pandas\parser.c:4184)
  File "pandas\parser.pyx", line 667, in pandas.parser.TextReader._setup_parser_source (pandas\parser.c:8449)
FileNotFoundError: File b'prova.csv' does not exist

Re: basi lettura csv (python)

Inviato: martedì 11 aprile 2017, 19:02
da crap0101
senza stare a installare altro, c'è il modulo csv

Re: basi lettura csv (python)

Inviato: martedì 11 aprile 2017, 22:13
da Atomo
purtroppo anche con quello mi si pianta, io scrivo così:

Codice: Seleziona tutto

import csv
import os
folder_path = input(" ")
for data_file in sorted(os.listdir(folder_path)):
    with open('prova.csv') as csvfile:
        readCSV = csv.reader(csvfile, delimiter=',')
        for row in readCSV:
            print (row)
e alla richiesta di input gli incollo il collegamento del percorso e premo invio e dopo la solita cascata di righe simili a quelle già postate sopra mi sputa:

Codice: Seleziona tutto

FileNotFoundError: [Errno 2] No such file or directory: 'prova.csv'
Sbaglio qualcosa nel fargli chiedere il percorso del file?
Mi sa che questo compito lo assegnerò a qualcun altro alla fne :muro:

--------------
aggiornamento 1:
Credo di si, perchè estraendo quel codice e mettendolo da solo senza richieste di percorso (quindi va a guardare nella cartella in cui sta il file .py) comincia a stampare a video tutte le righe del file csv

--------------
aggiornamento 2:
mi correggo, non credo possa essere il modo in cui gli do la cartella dove sta il file, perché se invece di chiedergli di aprire il file presente li dentro, gli chiedo solo di elencarmi i file contenuti nel percorso ( con print(data_file) ) lo fa senza problemi.

Re: basi lettura csv (python)

Inviato: mercoledì 12 aprile 2017, 14:47
da crap0101
Atomo [url=http://forum.ubuntu-it.org/viewtopic.php?p=4973254#p4973254][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:

Codice: Seleziona tutto

import csv
import os
folder_path = input(" ")
for data_file in sorted(os.listdir(folder_path)):
    with open('prova.csv') as csvfile:
        readCSV = csv.reader(csvfile, delimiter=',')
        for row in readCSV:
            print (row)
e alla richiesta di input gli incollo il collegamento del percorso e premo invio e dopo la solita cascata di righe simili a quelle già postate sopra mi sputa:

Codice: Seleziona tutto

FileNotFoundError: [Errno 2] No such file or directory: 'prova.csv'
Sbaglio qualcosa nel fargli chiedere il percorso del file?
Mi sa che questo compito lo assegnerò a qualcun altro alla fne :muro:

[...]
--------------
aggiornamento 2:
mi correggo, non credo possa essere il modo in cui gli do la cartella dove sta il file, perché se invece di chiedergli di aprire il file presente li dentro, gli chiedo solo di elencarmi i file contenuti nel percorso ( con print(data_file) ) lo fa senza problemi.
È proprio per quello... nel codice sopra ci sono vari problemi:

Codice: Seleziona tutto

for data_file in sorted(os.listdir(folder_path)):
    with open('prova.csv') as csvfile:
se vuoi aprire il file 'prova.csv' appunto per prova puoi togliere il ciclo for e fargli fare l'operazione solo una volta, anzichè N volte per gli N file presenti in `folder_path`.

Inoltre, per poter leggere un file in quel modo, cioè un percorso relativo, devi essere nella cartella appropriata, in questo caso nella cartella in cui si trova il file `prova.csv' (per cui chiedere di inserire `folder_path` non serve, potrebbe essere qualsiasi cosa e non cambierebbe molto il risultato).

Puoi comunque evitare di nominare esplicitamente il nome del file e utilizzare la variabile `data_file`... tieni presente che os.listdir elenca _solo_ i nomi dei file presenti nel percorso che gli passi e *non* il percorso assoluto di questi, ma per questo il modulo os.path ti tornerà utile.

Re: basi lettura csv (python)

Inviato: mercoledì 12 aprile 2017, 15:59
da Atomo
Si effettivamente se metto il file .py nella stessa cartella dei csv funziona.
Ti ringrazio (ringrazio tutti per essersi interessati) di avermi fatto notare la cosa. Prima di leggere l'ultimo post cercando un po' in giro ho provato a usare

Codice: Seleziona tutto

folder_path = os.chdir(input("  "))
e sembra fare quello che gli chiedo, per ora lascio stare così, poi mi metterò a leggere la documentazione della libreria os per capire il modulo che mi hai consigliato.
Speriamo che poi questa cosa la prenda in carico qualcuno di più capace di me con la programmazione :lol:
:ciao: