Topic: Ho un problema con il file csv  (Letto 179 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Valentina9213

  • python unicellularis
  • *
  • Post: 9
  • Punti reputazione: 0
    • Mostra profilo
Ho un problema con il file csv
« il: Ottobre 09, 2020, 11:40 »
Ciao a tutti. Sono nuova in questo forum e mi sono appena iscritta.
Ho un problema con un pezzo di codice in python, se mi aiutereste vi ringrazio infinitamente. comunque il mio pezzo di codice è questo:

import numpy as np
import pandas as pd
import datetime as dt
import requests
import csv

numAQP = raw_input ("Inserisci il numero della piattaforma:")
start_date = raw_input ("Inserisci la data iniziale:")
end_date = raw_input ("Inserisci la data finale:")

url = 'url' + numAQP +'/csv?start_date=' + start_date + '&end_date= ' + end_date
response = requests.get(url)
url_content = response.content
csv_file = open('out.csv', 'w')

csv_file.write(url_content)
csv_file.close()

Questo mi permette di scaricare un file csv dal server dati web, come ad es. temperatura, umidità ecc.
Il mio download dei dati ha una data di inizio (start_date) e una di fine (end_date), scrivendolo dal terminale con raw_input.
(es. Voglio i dati a partire dal 01-08-2020 al 20-08-2020) con le varie misure e fino a qui funziona perfettamente).

Il mio problema che sto riscontrando è che avrei bisogno che questi dati siano di un mese o un anno, ho bisogno di appendere più file CSV.
Come ho fatto io, non riesce a scaricarlo, evidentemente è a causa del server e mi è stato dato questo task.
Allora come posso appende il file csv creato in precedenza con un altro file csv nell'altro senza cambiare quello che è stato scritto prima con una nuova data? Per es. mi scarica 01-03-2020 fino a 20-03-2020, appendo l'altro file che va dal 21-03-2020 al 30-03-2020 e cosí via... cosí che posso avere un file csv con i dati all'interno che vanno dal 01-03-2020 fino al 30-09-2020 quindi sono 6 mesi.
Se puoi aiutarmi, ti ringrazio in anticipo.
« Ultima modifica: Ottobre 09, 2020, 11:43 da Valentina9213 »

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 321
  • Punti reputazione: 0
    • Mostra profilo
Re:Ho un problema con il file csv
« Risposta #1 il: Ottobre 09, 2020, 12:43 »
Cia @Valentina, ben venuta

Un po' confuso il Tuo post, utilizza il pulsante "pythoncode" dell'editor per formattare il codice ... poi "raw_input()"? Utilizzi una versione 2.x di python? Guarda che è fuori supporto.

...
Il mio problema che sto riscontrando è che avrei bisogno che questi dati siano di un mese o un anno, ho bisogno di appendere più file CSV.
Come ho fatto io, non riesce a scaricarlo, evidentemente è a causa del server e mi è stato dato questo task.
Allora come posso appende il file csv creato in precedenza con un altro file csv nell'altro senza cambiare quello che è stato scritto prima con una nuova data? Per es. mi scarica 01-03-2020 fino a 20-03-2020, appendo l'altro file che va dal 21-03-2020 al 30-03-2020 e cosí via... cosí che posso avere un file csv con i dati all'interno che vanno dal 01-03-2020 fino al 30-09-2020 quindi sono 6 mesi.

Dalla parte evidenziata, mi sembra di comprendere che il Tuo problema sia, essenzialmente, di appendere dei dati in input ad un file esistente, per far ciò, supposto sia del testi e di aprire il file di destinazione tramite la funzione builtin "open" è sufficiente aprirlo in scrittura utilizzando il suffisso "a", che, citando :
Citazione
'a' - open for writing, appending to the end of the file if it exists

quindi, supposto sia "miofile" la destinazione :
>>> f = open('miofile', 'a')
>>> f.write('Apelle figlio di Apollo')
23
>>> f.write('fece una palla di pelle di pollo')
32
>>> f.close()
....
da terminale il risultato sarebbe
NzP:~$ cat miofile
Apelle figlio di Apollofece una palla di pelle di polloNzP:~$

Offline Valentina9213

  • python unicellularis
  • *
  • Post: 9
  • Punti reputazione: 0
    • Mostra profilo
Re:Ho un problema con il file csv
« Risposta #2 il: Ottobre 09, 2020, 15:45 »
poi "raw_input()"? Utilizzi una versione 2.x di python? Guarda che è fuori supporto.
Si sto utilizzando la versione 2.7.6 on linux2, usando il Raspberry.

Il mio problema é di appendere il file in un ciclo for o if perché ho bisogno di cambiare le date, per es. ho una data iniziale 01-09-2020 e data finale 20-09-2020 e creo un file csv con le varie misurazioni tipo temperatura umiditá.
f = open(''out.csv'', '''wb'')
f.write()


Poi la seconda data che vado a immettere sará 21-09-2020 fino al 30-09-2020 ed eseguo
f2 = open ("out.csv", "a'')
f2.write()


e cosí via.
e ho risolto cosí che riesce a fare quello che dico.
Se é giusto.
 

import numpy as np
import pandas as pd
import datetime as dt
import requests
import csv

numAQP = raw_input ("Inserisci il numero della AQP:")
valore = raw_input("Opzioni , 1 per creare il file, 2 per appendere piu file:")

if valore == '1':
    start_date = raw_input ("Inserisci la data iniziale:")
    end_date = raw_input ("Inserisci la data finale:")

    url = 'linkPersonale' + numAQP +'/csv?start_date=' + start_date + '&end_date= ' + end_date
    response = requests.get(url)
    url_content = response.content
    csv_file = open('out.csv', 'wb')
    csv_file.write(url_content)
    csv_file.close()

   
if valore == '2':
    start_date = raw_input ("Inserisci la data iniziale:")
    end_date = raw_input ("Inserisci la data finale:")

    url = 'linkPersonale' + numAQP +'/csv?start_date=' + start_date + '&end_date= ' + end_date
    response = requests.get(url)
    url_content = response.content
    csv_file = open('out.csv', 'a')
    csv_file.write(url_content)
    csv_file.close()


E per ultimo. Come faccio a controllare se su quella data ci sono giá i dati presenti nel file out.csv?
Per es. i dati che vanno dal 01-09-2020 fino al 20-09-2020 ci sono giá nel file out.csv, non duplicarli.

Grazie

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 321
  • Punti reputazione: 0
    • Mostra profilo
Re:Ho un problema con il file csv
« Risposta #3 il: Ottobre 10, 2020, 12:19 »
poi "raw_input()"? Utilizzi una versione 2.x di python? Guarda che è fuori supporto.
Si sto utilizzando la versione 2.7.6 on linux2, usando il Raspberry.
Sul raspberry mi risultano girare diversi sistemi operativi, uno dei più diffusi è raspbian, appunto un sistema linux derivato dalla debian ... sui sistemi linux correnti normalmente girano contestualmente due versioni di python, la 2.7.x (in dismissione) e la 3.x.
Prova da shel a dare il comando "python3", vedi che Ti risponde, dovrebbe apriesi una shell python 3.x, se è così Ti consiglio caldamente di migrare in tale ambiente le Tue prove.



Il mio problema é di appendere il file in un ciclo for o if ...
E per ultimo. Come faccio a controllare se su quella data ci sono giá i dati presenti nel file out.csv?
Per es. i dati che vanno dal 01-09-2020 fino al 20-09-2020 ci sono giá nel file out.csv, non duplicarli.

Lasciamo perdere i vari input ed import di pandas, numpy, url, etc, trattiamo l'essenziale.
Stiamo trattando dei dati CVS, supponiamo files già "registrati" per semplicità, quindi del testo con stringhe disposte secondo un ben preciso ordine e con un separatore ben definito.
Dato che vuoi "unirli" è lecito supporre che tutti i files abbiano lo stesso schema dati, così come è lecito supporre che righe con date uguali abbiano gli stessi dati, dato che vuoi discriminare per data.
Siano file1.csv, file2.csv e file3.csv dei files dati scaricati che vogliamo raccogliere nel file "agosto.csv", supponiamo il tutto contenuto nella stessa directory, che abbia solo i csv interessanti.
sia questa la partenza :

NzP:~$ cat file1.csv
data;valore1;valore2;valore3
01-08-2020;9;12;10
02-08-2020;15;7;125
03-08-2020;10;10;5
04-08-2020;6;2;5
05-08-2020;8;9;11
NzP:~$ cat file2.csv
data;valore1;valore2;valore3
04-08-2020;6;2;5
05-08-2020;8;9;11
06-08-2020;11;10;8
07-08-2020;9;9;12
08-08-2020;13;9;11
NzP:~$ cat file3.csv
data;valore1;valore2;valore3
08-08-2020;13;9;11
09-08-2020;10;11;11
10-08-2020;11;12;14
11-08-2020;12;15;16
12-08-2020;14;12;7
NzP:~$ cat agosto.csv
data;valore1;valore2;valore3
01-08-2020;9;12;10
02-08-2020;15;7;125
NzP:~$

apriamo una shell python, ci spostiamo nella direttrice e leggiamo i files presenti :

Python 2.7.17 (default, Jul 20 2020, 15:37:01)
[GCC 7.5.0] on linux2
Type "help", "copyright", "credits" or "license()" for more information.
>>> import os
>>> import glob
>>> os.chdir('test/pyt/valentina')
>>> f_csv = glob.glob('*')
>>> f_csv
['agosto.csv', 'file3.csv', 'file1.csv', 'file2.csv']

il risultato di glob() non è ordinato, supposto che i nomi dei files siano progressivi conformemente ai dati ordiniamo e definiamo la destinazione

>>> f_csv.sort()
>>> f_csv
['agosto.csv', 'file1.csv', 'file2.csv', 'file3.csv']
>>> f_dest = 'agosto.csv'

consideriamo che dobbiamo verificare, per ogni singolo file che ogni singola riga dati sia contenuta o meno nel file di destinazione, dovremo quindi conoscere il contenuto della destinazione, che cambia ad ogni aggiunta, e scartare ciò che è già presente, aggiungere il resto ... si potrebbe fare così

>>> for f in f_csv:
if not f == f_dest:
with open(f_dest, 'r') as fd:
data = fd.read()
with open(f, 'r') as new:
rows = new.read().splitlines()
fd = open(f_dest, 'a')
for r in rows:
if not r in data:
fd.write(r+'\n')
fd.close()


>>>

ed avremo :

NzP:~$ cat agosto.csv
data;valore1;valore2;valore3
01-08-2020;9;12;10
02-08-2020;15;7;125
03-08-2020;10;10;5
04-08-2020;6;2;5
05-08-2020;8;9;11
06-08-2020;11;10;8
07-08-2020;9;9;12
08-08-2020;13;9;11
09-08-2020;10;11;11
10-08-2020;11;12;14
11-08-2020;12;15;16
12-08-2020;14;12;7
NzP:~$

... ovviamente, questo è un metodo proprio elementare, di base, destinato a perdere "efficienza" di fronte a grosse quantità di dati cui farebbe pensare il pandas nei Tuoi import ma "potrebbe" funzionare "se" i presupposti ipotizzati sono giusti, non si sa, al momento, la situazione.

Certo la documentazione di pandas potrebbe dare idee migliori ... ma il tono del post mi fa pensare opportuno suggerire questa lettura, credo molto utile.

Ciao
« Ultima modifica: Ottobre 10, 2020, 13:01 da nuzzopippo »