Topic: [Risolto]CSV e codifica testo : esistono utility o standard's relativi?  (Letto 214 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline nuzzopippo

  • python unicellularis
  • *
  • Post: 40
  • Punti reputazione: 0
    • Mostra profilo
Salute a Voi.

Come da oggetto, per necessità lavorative mi serviva associare luogo, sesso e data di nascita a nominativi cui disponevo solo del codice fiscale, ho risolto "al volo" con un piccolo script dopo essermi scaricato il csv di codifica dei comuni italiani dal  sito dell'istat (se interessano tali dati l'indirizzo è : http://www.istat.it/storage/codici-unita-amministrative/Elenco-comuni-italiani.csv)

Un intoppo avuto al primo utilizzo del file è stato causato dalla conversione in utf-8 che falliva, risolto sbrigativamente immaginandolo di provenienza windows ed impostando una codifica 'ISO-8859-1' nell'apertura del file.

So benissimo che la codifica del testo proveniente da fonti sconosciute è una rogna "secolare" ma mi chiedo se tra le sterminate librerie di python ve ne è qualcuna in grado di dar soluzione al problema o, quanto meno, una convenzione in merito.
Da precedenti ricerche mi ero convinto che i files csv "dovessero" essere in codifica utf-8 ... ma pare che l'istat non concordi sulla cosa.

P.S. - tempo fa trovai chardet nelle librerie python, utile ma non troppo.
« Ultima modifica: Febbraio 07, 2019, 11:50 da nuzzopippo »

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:CSV e codifica testo : esistono utility o standard's relativi?
« Risposta #1 il: Febbraio 05, 2019, 23:00 »
CSV e' il farwest.
Ci sarebbe pure uno standard (https://www.ietf.org/rfc/rfc4180.txt), ma e' noto che di fatto ognuno fa un po' il ca**o che gli pare e lo standard (postumo) lo dice pure.

"""
The comma separated values format (CSV) has been used for exchanging
   and converting data between various spreadsheet programs for quite
   some time.  Surprisingly, while this format is very common, it has
   never been formally documented.
...
While there are various specifications and implementations for the
   CSV format (for ex. [4], [5], [6] and [7]), there is no formal
   specification in existence, which allows for a wide variety of
   interpretations of CSV files.  This section documents the format that
   seems to be followed by most implementations:
...
 Due to lack of a single specification, there are considerable
      differences among implementations.  Implementors should "be
      conservative in what you do, be liberal in what you accept from
      others" (RFC 793 [8]) when processing CSV files.  An attempt at a
      common definition can be found in Section 2.
"""

O in altre parole: lo standard grosso modo documenta un po' quale e' l'implementazione piu' diffusa.

Su encoding:
"""
Common usage of CSV is US-ASCII, but other character sets defined
      by IANA for the "text" tree may be used in conjunction with the
      "charset" parameter.

 As per section 4.1.1. of RFC 2046 [3], this media type uses CRLF
      to denote line breaks.  However, implementors should be aware that
      some implementations may use other values.
"""

Offline nuzzopippo

  • python unicellularis
  • *
  • Post: 40
  • Punti reputazione: 0
    • Mostra profilo
Re:CSV e codifica testo : esistono utility o standard's relativi?
« Risposta #2 il: Febbraio 06, 2019, 11:04 »
CSV e' il farwest.

Già ... La vita è fatta per soffrire!

Ci sarebbe pure uno standard (https://www.ietf.org/rfc/rfc4180.txt), ma e' noto che di fatto ognuno fa un po' il ca**o che gli pare e lo standard (postumo) lo dice pure.

Grazie della indicazione, leggerò :)

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.859
  • Punti reputazione: 9
    • Mostra profilo
Re:CSV e codifica testo : esistono utility o standard's relativi?
« Risposta #3 il: Febbraio 06, 2019, 18:15 »
Sì ma al di là di questo non capisco dove risiede concretamente il problema. Csv è un file di testo puro, ed è noto che i file di testo puri non hanno metainformazioni sull'encoding. Se anche ci fosse uno standard che "prescrive" utf8, non ci sarebbe nessun modo per imporlo visto che appunto, un file di testo non ha modo di segnalare l'encoding in cui è scritto.
Quindi, hai in mano lo stesso problema che avresti con qualsiasi altro file di testo. Il fatto che sia un csv è una falsa pista che non c'entra niente.
Il problema è: quando apri un file di testo, O sai l'encoding (e allora sei a posto) OPPURE non lo sai (e allora sei nei pasticci). Se non lo sai, hai due strade: O cerchi di saperlo (informandoti bene presso il provider di quel file), OPPURE tiri a indovinare, per esempio con chardet https://github.com/chardet/chardet o librerie analoghe.

Offline nuzzopippo

  • python unicellularis
  • *
  • Post: 40
  • Punti reputazione: 0
    • Mostra profilo
Re:CSV e codifica testo : esistono utility o standard's relativi?
« Risposta #4 il: Febbraio 06, 2019, 20:50 »
Sì ma al di là di questo non capisco dove risiede concretamente il problema....

Problema? No, certamente, seccatura al più, almeno quando ti capita una urgenza e devi perderci su un po' di tempo a tirare a indovinare quale set caratteri è stato usato ... niente di che, comunque.
La maggior parte dei casi "seccanti" capitano quando un dirigente ti porta un file reperito chissà dove e vuole i dati puliti e in linea nel database per ieri ... hai voglia a chiedere dell'encoding, il 90% degli interlocutori non l'ha mai sentito nominare! ;)

Giustissimo quel che dici sul testo "puro", già capitato più volte e conoscevo chardet da un po', fa anche parte della libreria python fornita nella mia distribuzione (non so se è presente nella standard), ci ho anche giochicchiato un po', come detto prima "utile ma non troppo", strumento discreto per cercare di "indovinare" ma non è che faccia miracoli, comunque aiuta.

La mia domanda è motivata dalla constatazione di quanto sia estesa la libreria python e di quanto Voi la conosciate più di me, sai mai ci sia una utilità che ti apre comunque un file di testo (magari con qualche carattere strano), domandare non è certo la fine del mondo.
... in ogni caso, utilità che magari ci si può anche costruire da soli.

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.859
  • Punti reputazione: 9
    • Mostra profilo
Re:CSV e codifica testo : esistono utility o standard's relativi?
« Risposta #5 il: Febbraio 06, 2019, 23:01 »
Non hai capito. Se non conosci l'encoding di un file, non è che python possa conoscerlo al posto tuo. Non è un problema di python. La dua domanda equivale a chiedere se nella libreria standard di python esiste un modulo per leggere il pensiero. Non esiste un modulo per leggere il pensiero nella libreria standard di python.
Aprire un file "in qualche modo" è sempre possibile: open di per sé funziona sempre, ci mancherebbe. E' poi leggerlo che può dare problemi. Poi certo, visto che *adesso* menzioni la possibilità di produrre "caratteri strani", credo che tu ti riferisca alla possibilità di settare il parametro "errors" di open https://docs.python.org/3/library/functions.html#open, cosa che è sempre un rifugio possibile... ma questo non è certamente "indovinare l'encoding". 
Detto questo, a me risulta che chardet sia invece *parecchio* funzionale, anche e soprattutto con file prodotti in ambiente windows. Dopo tutto, se va bene a Mozilla... Ma lo hai *davvero* provato?
Uhm, a proposito: se un file di testo non-utf8 viene prodotto in ambiente windows, è più probabile che qui da noi sia encodato in cp1252, che NON è la stessa cosa di iso-8859-1...

In ogni caso: https://docs.python.org/3.3/howto/unicode.html
e https://pythoninwindows.blogspot.com/2018/08/installare-e-usare-python-su-windows9.html

Offline nuzzopippo

  • python unicellularis
  • *
  • Post: 40
  • Punti reputazione: 0
    • Mostra profilo
Re:CSV e codifica testo : esistono utility o standard's relativi?
« Risposta #6 il: Febbraio 07, 2019, 11:39 »
Non hai capito. Se non conosci l'encoding di un file, non è che python possa conoscerlo al posto tuo. Non è un problema di python. La dua domanda...
Ma dai, mai imputato a python niente, su questi concetti c'ero arrivato, guarda la premessa iniziale :)
Citazione
So benissimo che la codifica del testo proveniente da fonti sconosciute è una rogna "secolare"
Ciò non toglie che la mia ignoranza possa essere una rogna ancora peggiore, pur se non ho trovato in risposta librerie con capacità divinatorie le rfc segnalate da @riko mettono ME in condizione di rispettarle, già chiariscono che lo utf-8 che io credevo valido, non è opportuno e sarebbe meglio la codifica ascii, non parliamo, poi, del "cr-lf".

A pensarci bene, questo aspetto potrei anche considerarlo "risolto", metterò indicazione in tal senso pur senza voler minimamente sfuggire ad apprezzati interventi ... e rimproveri ;)

...  Poi certo, visto che *adesso* menzioni la possibilità di produrre "caratteri strani", credo che tu ti riferisca alla possibilità di settare il parametro "errors" di open https://docs.python.org/3/library/functions.html#open, cosa che è sempre un rifugio possibile... ma questo non è certamente "indovinare l'encoding". 

Ecco! La "vera" utilità di queste discussioni, con queste brevi righe hai evidenziato qualcosa che non ho compreso malgrado abbia "letto" (ma "capito" poi?) e che mi farà tornare a leggere. Comunque, a volte, può essere sufficiente "avere il grosso", non è sempre necessaria la perfezione.
In merito alla codifica "ISO-8859-1" è solo la prima della scaletta che normalmente uso (poi ISO-8859-15 e windows-1252), tra le poche imparate "a memoria" e spesso sufficienti per i miei piccoli script.

...Ma lo hai *davvero* provato?
Come detto : giochicchiato, se guardi qui vi troverai uno dei miei primi giochetti, noterai che mi riconosco inadeguato e, per me e le mie capacità correnti, rimane "utile ma non troppo", malgrado siano passati un paio di anni.

In ogni caso, non posso dire di aver *davvero* provato niente in python, tutt'ora se mi trovo costretto (per quanto posso, evito) a dover fare "qualcosa" ricorro ad altri linguaggi, tempo permettendo (brutto tiranno) ed ignoranza (perfida megera) consentendo sono un forno a fuoco lento e non mi ci sono misurato ... magari tra un ano o due ...
Ovviamente, considero gli script di utilità immediata come "niente".

Precisato quanto sopra (il "sono qui per imparare" della mia presentazione), grazie dei link, li avevo già trovati entrambi ma è sempre utile averli a portata di mano.
:)