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.
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")
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 ʻintet
str, 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).
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 ( 20
→ 18
), 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 ...
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.
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()