Précautions lors de la saisie à partir de CSV avec Python et de la sortie vers json pour faire exe

Comme le titre l'indique, j'écrirai un mémorandum de notes lors de la saisie à partir de CSV avec Python et de la sortie vers json pour le rendre exe. L'exemple d'implémentation est un outil complètement personnel, donc je vais juste vous donner un aperçu. L'important est le message d'erreur et le remède.

CSV qui provoque une erreur de décodage

Commencez par charger csv. Préparez les données en csv appelées ʻinput.csv` et lisez-les.

import csv

csv_file = open("./input.csv", "r")
c = csv.DictReader(csv_file)

Soudainement, quand j'essaye de regarder le contenu de csv ici, j'obtiens l'erreur suivante (probablement).

Exception has occurred: UnicodeDecodeError
'cp932' codec can't decode byte 0xef in position 0: illegal multibyte sequence
  File "C:\Users\hoge\fuga.py", line 19, in <module>
    for row in c:

Vous serez grondé de ne pas pouvoir décoder. C'est parce que python essaie de créer le fichier ʻutf-8 shift-jis`. Il doit être modifié comme suit.

csv_file = open("input.csv", "r",encoding="utf-8-sig")

Toutes les mêmes données json

La partie qui était la plus agaçante cette fois.

#Extrait des paramètres de csv
params = []
for row in c:
    points.append(row)
n = len(params)

#Charger json et sécuriser une trame de paramètres
import json
json_open = open('sample.json', 'r')
j = json.load(json_open)
for i in range(n-1):
    j["Movements"].append(j["Movements"][0])

J'ai fait quelque chose de gênant dans la rangée du bas, qui était la source du problème, mais sample.json a un modèle de données, qui est étendu au nombre de lignes de paramètres n. Par conséquent, j'ai pris la méthode de copie du modèle n-1 fois. En conséquence, «n» cadres ont été créés avec succès dans la clé «Mouvements» des données json «j», donc après cela, l'instruction «for» est simplement tournée pour insérer les données.

…… Mais après avoir fini de saisir les données, j'ai été troublé par le résultat mystérieux que ** pour une raison quelconque, toutes les lignes ont les mêmes données **.

Après un peu de débogage, j'ai trouvé que chaque entrée réécrit chaque ligne, ce qui signifie que ** chaque ligne fait référence aux mêmes données **. Même si les données apparentes sont dans la ligne «n», toutes se réfèrent à une seule donnée, et si l'une d'entre elles est modifiée, toutes les données seront affectées.

Pourquoi est-ce arrivé?

Pour les types comme ʻintetstr, même si vous copiez une variable avec =, elle sera considérée comme "une autre variable" et affectée d'un identifiant lorsque vous apportez des modifications, mais list Si vous modifiez après avoir copié la variable avec = (en fait, elle n'a pas pu être copiée), les données d'origine seront modifiées. Je le connaissais en tant que connaissance, mais aussi «dict». La seule solution est de copier les variables en utilisant une technique appelée copie papier.

#Extrait des paramètres de csv
params = []
for row in c:
    points.append(row)
n = len(params)

#Charger json et sécuriser une trame de paramètres
import json
import copy
json_open = open('sample.json', 'r')
j = json.load(json_open)
for i in range(n-1):
    new_j = copy.deepcopy(j["Movements"][0])
    j["Movements"].append(new_j)

Dans ce cas, il devait s'agir de «deepcopy» (copie profonde) au lieu de simplement «copie» (copie superficielle).

Exe qui ne fonctionne pas

Il existe un module appelé pyinstaller qui le transforme en un exe afin que même les personnes qui n'ont pas Python puissent l'exécuter. Quand j'ai essayé de pip ceci, je ne pouvais pas l'installer à cause d'une erreur, et si je faisais le tour, je pouvais simplement rétrograder la version de pip ( 2018), donc j'ai réussi. Quand j'ai essayé de le reproduire maintenant, pour une raison quelconque, même le dernier pip a réussi, donc l'erreur ne peut pas être reproduite. Je suis désolé.

Je l'ai donc transformé en un exe en utilisant pyinstaller en toute sécurité, mais même si je l'exécute, il se termine immédiatement. Il ne crache même pas le premier print que j'ai mis pour le débogage, donc il semble qu'il y ait un problème au moment de ʻimport`. Donc, je vais chasser les sorcières une par une pour les modules suivants que j'ai réellement mis en place.

import json
import pprint
import csv
import cmath
import math
import numpy as np
import copy
import os

En conséquence, cela a été causé par numpy. Heureusement, je n'ai pas utilisé la partie qui avait besoin de numpy dans le programme (j'ai utilisé np.pi, mais je n'en ai plus besoin), alors j'ai simplement supprimé le module. Si vous devez exécuter un programme qui utilise numpy pour calculer rigoureusement, détrompez-vous ...

Résumé

Je suis désolé qu'il y ait beaucoup de contenus que "j'ai réussi à le faire, mais je n'ai pas compris", mais j'oublierai de plus en plus si je n'accumule pas de telles choses, alors je l'ai écrit pour moi-même. J'ai eu peur de sauter ce genre de chose jusqu'à présent, donc à partir de maintenant j'écrirai activement des enregistrements de programme comme ce journal.

Code

C'est un outil complètement personnel, donc je ne pense pas qu'il soit utile à personne, mais pour le moment.


import json
import pprint
import csv
import cmath
import math
import copy
import os

json_open = open('./sample.json', 'r')
j = json.load(json_open)

print("sample.Json chargé")

csv_file = open("./input.csv", "r",encoding="utf-8-sig")
c = csv.DictReader(csv_file)

points = []

for row in c:
    points.append(row)

n = len(points)

for i in range(n-1):
    new_j = copy.deepcopy(j["Movements"][0])
    j["Movements"].append(new_j)

for i,p in enumerate(points):
    x = float(p['X'])
    y = float(p['Y'])
    z = float(p['Z'])
    duration = float(p['Duration'])
    j["Movements"][i]["Duration"] = duration
    j["Movements"][i]["StartPos"]["x"] = x
    j["Movements"][i]["StartPos"]["y"] = y
    j["Movements"][i]["StartPos"]["z"] = z
    j["Movements"][i-1]["EndPos"]["x"] = x
    j["Movements"][i-1]["EndPos"]["y"] = y
    j["Movements"][i-1]["EndPos"]["z"] = z
    y -= 1.5
    c = complex(-x,-z)
    rad = cmath.phase(c)
    deg = -math.degrees(rad)+90
    #print(deg)
    j["Movements"][i]["StartRot"]["y"] = deg 
    j["Movements"][i-1]["EndRot"]["y"] = deg 
    c2 = complex(abs(c),y)
    rad2 = cmath.phase(c2)
    deg2 = math.degrees(rad2)
    #print(-deg2)
    j["Movements"][i]["StartRot"]["x"] = deg2 
    j["Movements"][i-1]["EndRot"]["x"] = deg2

pprint.pprint(j)

with open('output.json', 'w') as f:
    json.dump(j, f, indent=4)

print("Terminé le travail")
end = input()

Recommended Posts

Précautions lors de la saisie à partir de CSV avec Python et de la sortie vers json pour faire exe
Grattage de la nourriture avec python et sortie en CSV
Convertir JSON en CSV avec Python de Splunk
[Python / Ruby] Comprendre le code Comment obtenir des données en ligne et les écrire au format CSV
Fractal pour faire et jouer avec Python
2.Faites un arbre de décision à partir de 0 avec Python et comprenez-le (2. Bases du programme Python)
Lisez le fichier CSV avec Python et convertissez-le en DataFrame tel quel
Créez un arbre de décision à partir de 0 avec Python et comprenez-le (4. Structure des données)
Exportez le rapport au format PDF à partir de DB avec Python et attachez-le automatiquement à un e-mail et envoyez-le
Lire JSON avec Python et générer un CSV
Générez une instruction d'insertion à partir de CSV avec Python.
WEB grattage avec python et essayez de créer un nuage de mots à partir des critiques
Conseils et précautions lors du portage des programmes MATLAB vers Python
Comment convertir un fichier JSON en fichier CSV avec Python Pandas
Recevoir des e-mails de Gmail et étiqueter avec Python3
Lire le fichier json avec Python, le formater et générer le json
Essayez de le faire avec GUI, PyQt en Python
Lorsqu'il est difficile de configurer un serveur SMTP localement lors de l'envoi de courrier avec Python.
Associez Python Enum à une fonction pour la rendre appelable
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
J'ai essayé de créer un générateur qui génère une classe conteneur C # à partir de CSV avec Python
Écrire en csv avec Python
[Python Kivy] Comment créer un fichier exe avec pyinstaller
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
Comment ne pas échapper au japonais en traitant avec JSON en Python
Rejoignez CSV normalisé par les pandas Python pour faciliter la vérification
Comment importer des fichiers CSV et TSV dans SQLite avec Python
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
Comment éviter la duplication des données lors de la saisie de Python vers SQLite.
Précautions lors du passage de def aux fonctions triées et groupby en Python? ??
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
Comment gérer les erreurs lors de l'installation de Python et de pip avec choco
Jetez quelque chose dans Kinesis avec python et assurez-vous qu'il est dans
Extraire des tables de base de données avec CSV [connexion ODBC de R et python]
[Python] Essayez de reconnaître les caractères des images avec OpenCV et pyocr
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
Créer Apache Log CSV avec Python
[Python] Ecrire dans un fichier csv avec Python
Sortie vers un fichier csv avec Python
Encodage et décodage JSON avec python
Créer un exe Scrapy avec Pyinstaller
Précautions lors de l'utilisation de phantomjs de python
Précautions lors de l'utilisation de six avec Python 2.5
[TCP / IP] Après avoir étudié, essayez de créer un client HTTP avec Python
[Bases de la science des données] J'ai essayé d'enregistrer de csv à mysql avec python
Essayez de créer foldl et foldr avec Python: lambda. Aussi mesure du temps
Utilisez Python de Java avec Jython. J'étais aussi accro.
Convertissez la feuille de calcul en CSV et importez-la dans Cloud Storage avec Cloud Functions
Précautions et gestion des erreurs lors de l'appel de la DLL .NET à partir de python à l'aide de pythonnet
Erreur due à UnicodeDecodeError lors de la lecture d'un fichier CSV avec Python [Pour les débutants]
[Zaif] J'ai essayé de faciliter le commerce de devises virtuelles avec Python
[python] Envoyez l'image capturée de la caméra Web au serveur et enregistrez-la
Créez un arbre de décision à partir de 0 avec Python et comprenez-le (5. Entropie des informations)
De Python à l'utilisation de MeCab (et CaboCha)
Comment convertir Python en fichier exe
Convertir de PDF en CSV avec pdfplumber