[Risolto] basi lettura csv (python)

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Atomo
Prode Principiante
Messaggi: 171
Iscrizione: venerdì 24 ottobre 2008, 21:34
Desktop: Gnome
Distribuzione: Ubuntu 21.04

[Risolto] basi lettura csv (python)

Messaggio 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'
???
Ultima modifica di Atomo il mercoledì 12 aprile 2017, 16:00, modificato 2 volte in totale.
---
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: basi lettura csv (python)

Messaggio 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.

(;
Avatar utente
Atomo
Prode Principiante
Messaggi: 171
Iscrizione: venerdì 24 ottobre 2008, 21:34
Desktop: Gnome
Distribuzione: Ubuntu 21.04

Re: basi lettura csv (python)

Messaggio 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
---
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: basi lettura csv (python)

Messaggio da crap0101 »

senza stare a installare altro, c'è il modulo csv
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
Atomo
Prode Principiante
Messaggi: 171
Iscrizione: venerdì 24 ottobre 2008, 21:34
Desktop: Gnome
Distribuzione: Ubuntu 21.04

Re: basi lettura csv (python)

Messaggio 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.
---
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: basi lettura csv (python)

Messaggio 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.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
Atomo
Prode Principiante
Messaggi: 171
Iscrizione: venerdì 24 ottobre 2008, 21:34
Desktop: Gnome
Distribuzione: Ubuntu 21.04

Re: basi lettura csv (python)

Messaggio 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:
---
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti