[PYTHON] Mémorandum (contre-mesures contre l'erreur de décodage Unicode lors de la lecture de fichiers CSV)

** Vous pouvez l'automatiser avec python, non? Ravi de vous rencontrer, alors je ferai de mon mieux Record Part 1 **

<détails>

** ~~ Écrivez seulement la conclusion en premier ~~ ** </ summary> Lors de la spécification avec open (fichier CSV, encoding = code de caractère) Vous pouvez utiliser le "code de caractère utilisé dans le fichier CSV" comme code de caractère. Cette fois, c'était un fichier contenant du japonais, il fallait donc le spécifier avec Shift-jis.

** ~~ Je m'en fous le journal ~~ ** Exporte les données au format CSV avec un logiciel interne → Le responsable moule sur le fichier Excel avec un bon feeling → Envoyez le fichier Excel à l'autre partie par email On m'a dit d'utiliser python pour bien automatiser le travail ci-dessus, alors j'ai décidé de faire de mon mieux avec zéro démarrage. Je suis complètement amateur de python, mais il semble que si j'ai une certaine connaissance de VBA, je peux le gérer. Est-ce vrai? ** ~~ Journal jusqu'ici ~~ **

** ~~ Sujet ~~ ** ** ・ Quand je lis le fichier CSV, j'ai un UnicodeDecodeError, donc je veux le réparer **

** ~~ Explication de la situation d'ici ~~ ** J'ai commencé par vérifier les fonctions de base de python à l'aide de Google Colaboratory. Placez un fichier CSV approprié directement sous le lecteur Google. Créez un nouveau bloc-notes à partir du Google Colaboratory. Essayez un exemple de programme qui lit et génère csv. Ref:https://note.com/092i034i/n/n76f2c2de197

test


import csv #Si vous écrivez ceci, il semble que vous puissiez gérer les fichiers CSV

csvfile = open('/content/drive/My Drive/test.csv') #Importé le fichier csv dans la variable python csvfile
reader = csv.DictReader(csvfile) #J'ai en quelque sorte jeté les informations du fichier csv dans une variable appelée reader

for row in reader: #Je ne suis toujours pas sûr. Cela ressemble à un traitement itératif, mais ...

 print(row) #Celui qui produit le contenu de la ligne variable

Cependant, il ne compile pas. J'obtiens une erreur.

error-message


UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-30-e6400dcd8fdb> in <module>()
      4 reader = csv.DictReader(csvfile)
      5 
----> 6 for row in reader:
      7  print(row)

En tant que personne qui pensait que ses notes en anglais étaient accablantes et mortelles, et même l'annonce de "Briser la cible!" De Smash Bra était une langue d'un autre monde, à ce stade, il se sentait déjà malade, mais un. Il n'y a pas d'autre choix que de travailler dessus un par un.

Apparemment, le décodage a échoué lors de l'affectation du contenu du lecteur de variable à la ligne. Aucune erreur ne s'est produite dans le processus de csvfile = open (test.csv).

`Le flux de traitement du programme considéré à partir de ce résultat

  1. Encodez (cryptez) le fichier CSV sur le lecteur et importez-le dans la variable python csvfile
  2. Remplacez le contenu de la variable csvfile par la variable Reader selon la règle csv.dictreader telle qu'elle est codée.
  3. Décryptez le contenu du lecteur de variables et transférez-le dans la ligne de variables (le décryptage a échoué ici et une erreur s'est produite)
  4. Sortez le contenu de la variable Row de la première ligne à la fin `

Par conséquent, j'ai pensé qu'il y avait quelque chose qui n'allait pas avec la méthode de déchiffrement lors du déplacement du contenu du lecteur vers la ligne. La recherche du message d'erreur sur le net semble être différente.

`Quelque chose comme le bon flux de traitement

  1. Le fichier CSV sur le lecteur contient du japonais, il a donc été codé avec Shift-jis
  2. Cependant, sauf indication contraire, python encode le contenu du fichier CSV avec UTF-8 et l'importe dans la variable csvfile.
  3. À ce stade, le contenu de la variable csvfile est "des caractères brouillés dans lesquels le fichier Shift-jis est codé de force avec UTF-8".
  4. Cependant, pour une raison quelconque, même dans cet état, il est possible d'affecter de la variable csvfile à la variable Reader par la règle de csv.dictreader.
  5. Décodez le contenu du lecteur de variables et transférez-le dans la ligne de variables (il semble que les caractères déformés ne puissent être vus que s'ils ne peuvent pas être décodés ici)
  6. Sortez le contenu de la variable Row de la première ligne à la fin `

Je ne sais pas pourquoi csv.dictreader est OK, Après l'avoir réparé, la compilation est passée, donc pour le moment je vais la diviser comme telle.

** Même s'il y a un problème au moment de l'encodage, il semble qu'il soit découvert au moment du décodage par traitement python. ** ** C'est probablement quelque chose que je ne comprends pas à cause de mon manque de connaissances sur l'encodage et le décodage ... mais je ne vais pas parler d'automatisation principale, donc je vais y renoncer cette fois.

Cependant, après le premier jour, je ne peux lire que le fichier CSV, est-ce vraiment bien? Si je suis Olimer, je ne peux pas sortir d'Hokotate et retourner au sol. Est-il vraiment vrai que tout ce dont vous avez besoin est une connaissance de VBA? anxiété.

Supplément: Code lorsque la compilation passe après correction


import csv

csvfile = open('/content/drive/My Drive/test.csv',encoding="shift-jis")  #Décaler le fichier csv japonais-Importer avec jis
reader = csv.DictReader(csvfile)

for row in reader:
 print(row)