Topic: #python #database csv #estrarre colonna e riscriverla in un file  (Letto 133 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline soccarista

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Buongiorno.   La fine del mio programma non funziona.  In poche parole, ho un file, di cui ho estratto una colonna messa in una list intermediaria.  Poi cercho di scrivere questa list in un file in formato csv vuoto.  Ringrazio ogni consiglio .
Il programma :
import csv
with open('D:\\Documents\\CSV\\precipitazioni.csv', newline='') as cf1:
    lignes= cf1.readlines()

k=0
for line in lignes:
    k=k+1
print(k)
L1=[]

for p in range(1,k):
    ligne=lignes[p]
    parole=ligne.split(',')
    a=parole[9]
    L1.append(a)

with open('D:\\Documents\\CSV\\precipitazioni2.csv', 'w', newline='')as cf2:
    writer = csv.writer(cf2,delimiter=' ')
for p in range(1,k):
    fields=L1[p]
    writer.writerow(fields)

cf1.close()
cf2.close()


Di nuovo, ringrazio ogni uno che avrebbe un consiglio a darmi.
CIao.

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 388
  • Punti reputazione: 0
    • Mostra profilo
Re:#python #database csv #estrarre colonna e riscriverla in un file
« Risposta #1 il: Aprile 15, 2021, 07:39 »
Un esempio dei dati da trattare e di cosa vuoi ottenere?

... Poi, un delimtatore nullo non mi sembra una grande idea e nei futuri post utilizza il pulsante "pythoncode" dell'editor per formattare il codice.

Offline soccarista

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:#python #database csv #estrarre colonna e riscriverla in un file
« Risposta #2 il: Aprile 15, 2021, 21:07 »
Buonasera.  Grazie per avere risposto.
Qualche indicazione per spiegare i miei scopi.
Il file precipitazioni si presenta cosi :
code,datetime,temperature,smlp,rh,wind_speed,wind_direction,wind_gust,rain_rate,daily_rain,dew_point,rad,uv
lig063,31/12/2019 23:05,5.60,1032.8,67,1.60,0.00,3.20,0.00,0.00,-0.10,,
lig063,31/12/2019 23:10,5.40,1032.7,67,0.00,0.00,1.60,0.00,0.00,-0.20,,
lig063,31/12/2019 23:15,5.40,1032.6,67,0.00,0.00,1.60,0.00,0.00,-0.30,,
lig063,31/12/2019 23:20,5.30,1032.6,67,0.00,0.00,3.20,0.00,0.00,-0.30,,
lig063,31/12/2019 23:25,5.40,1032.6,67,1.60,0.00,6.40,0.00,0.00,-0.30,,
lig063,31/12/2019 23:30,5.50,1032.7,67,0.00,270.00,3.20,0.00,0.00,-0.10,,
lig063,31/12/2019 23:35,5.50,1032.7,66,1.60,0.00,4.80,0.00,0.00,-0.40,,

Ci sono cosi più di 105000 linee.

Vorrei estrare la colonna 9 e metterla in un file vuoto precipitazioni2.

import csv
with open('D:\\Documents\\CSV\\precipitazioni.csv', newline='') as cf1:
    lignes= cf1.readlines()

k=0
for line in lignes:
    k=k+1
print(k)
L1=[]

for p in range(1,k):
    ligne=lignes[p]
    parole=ligne.split(',')
    a=parole[9]
    L1.append(a)


with open('D:\\Documents\\CSV\\precipitazioni2.csv', 'w', newline='')as cf2:
    my_writer = csv.writer(cf2, newline='')
for line in lignes:   
    my_writer.writerow(lignes[9])

cf1.close()
cf2.close()


Ho come errore :
  File "D:\Documents\Scripts\extraire precipitazioni 2.py", line 29, in <module>
    my_writer.writerow(lignes[9])

ValueError: I/O operation on closed file.


Ho anche una seconda prova :

import csv
with open('D:\\Documents\\CSV\\precipitazioni3.csv',newline='') as cf1:
with open('D:\\Documents\\CSV\\precipitazioni2.csv',newline='')as cf2:
myreader = csv.reader(cf1, delimiter='')
mywriter = csv.writer(cf2,delimiter='')
for line in myreader:   
    mywriter.writerow(line[9])

cf1.close()
cf2.close()

Con quest'errore : line 11
    with open('D:\\Documents\\CSV\\precipitazioni2.csv',newline='')as cf2:
       ^
IndentationError: expected an indented block

Ecco la situazione.  Ringrazio ogni aiuto.

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 388
  • Punti reputazione: 0
    • Mostra profilo
Re:#python #database csv #estrarre colonna e riscriverla in un file
« Risposta #3 il: Aprile 16, 2021, 13:26 »
ValueError: I/O operation on closed file.

Il problema in citazione è dato dallo statement with ed indica la necessità di approfondire le basi del linguaggio innanzi tutto : quanto un file viene aperto tramite "with" viene chiuso non appena concluso il blocco di codice sottoposto a detto statement.

Il secondo errore è dato da una errata indentazione ... prima di misurarti con 150.000 righe dati (diciamo che anche io ci starei attento) Ti suggerirei di approfondire il linguaggio e di non procedere a tentativi, leggi approfonditamente la documentazione di ciò che vuoi utilizzare.

Per altro, posto un file "precipitazioni.csv" contenente i dati nel Tuo esempio
NzP:~$ cat precipitazioni.csv
code,datetime,temperature,smlp,rh,wind_speed,wind_direction,wind_gust,rain_rate,daily_rain,dew_point,rad,uv
lig063,31/12/2019 23:05,5.60,1032.8,67,1.60,0.00,3.20,0.00,0.00,-0.10,,
lig063,31/12/2019 23:10,5.40,1032.7,67,0.00,0.00,1.60,0.00,0.00,-0.20,,
lig063,31/12/2019 23:15,5.40,1032.6,67,0.00,0.00,1.60,0.00,0.00,-0.30,,
lig063,31/12/2019 23:20,5.30,1032.6,67,0.00,0.00,3.20,0.00,0.00,-0.30,,
lig063,31/12/2019 23:25,5.40,1032.6,67,1.60,0.00,6.40,0.00,0.00,-0.30,,
lig063,31/12/2019 23:30,5.50,1032.7,67,0.00,270.00,3.20,0.00,0.00,-0.10,,
lig063,31/12/2019 23:35,5.50,1032.7,66,1.60,0.00,4.80,0.00,0.00,-0.40,,
NzP:~$ cat dealy_rayn_lig063.csv
cat: dealy_rayn_lig063.csv: File o directory non esistente
NzP:~$


Puoi estrarre la colonna 9, diciamo nel file "dealy_rayn_lig063.csv" (che poi non è considerabile propriamente un csv) così:
>>> f_inp_name = 'precipitazioni.csv'
>>> f_out_name = 'dealy_rayn_lig063.csv'
>>> try:
f_inp = open(f_inp_name, 'r')
f_out = open(f_out_name, 'w')
for row in f_inp.readlines():
data = row.split(',')
f_out.write(data[9] + '\n')
except Exception as e:
print('Avvenuto errore:\n%s' % repr(e))
finally:
f_inp.close()
f_out.close()


11
5
5
5
5
5
5
5
>>>

avresti :
NzP:~$ cat dealy_rayn_lig063.csv
daily_rain
0.00
0.00
0.00
0.00
0.00
0.00
0.00
NzP:~$

Offline soccarista

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:#python #database csv #estrarre colonna e riscriverla in un file
« Risposta #4 il: Aprile 16, 2021, 20:32 »
Ciao. Ho capito per l'azione open with... .Grazie per i consigli.