Wie der Titel schon sagt, werde ich ein Memorandum mit Notizen schreiben, wenn ich mit Python aus CSV eingebe und es an json ausgebe, um es exe zu machen. Die Beispielimplementierung ist ein ganz persönliches Werkzeug, daher gebe ich Ihnen nur einen Überblick. Das Wichtigste ist die Fehlermeldung und das Mittel.
Laden Sie zuerst csv. Bereiten Sie die Daten in csv mit dem Namen input.csv
vor und lesen Sie sie.
import csv
csv_file = open("./input.csv", "r")
c = csv.DictReader(csv_file)
Wenn ich hier versuche, den Inhalt von csv zu betrachten, wird plötzlich (wahrscheinlich) der folgende Fehler angezeigt.
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:
Sie werden beschimpft, weil Sie nicht dekodieren können. Dies liegt daran, dass Python versucht, die utf-8
-Dateishift-jis
zu erstellen. Es muss wie folgt geändert werden.
csv_file = open("input.csv", "r",encoding="utf-8-sig")
Der Teil, der diesmal am nervigsten war.
#Auszug aus Parametern aus csv
params = []
for row in c:
points.append(row)
n = len(params)
#Laden Sie json und sichern Sie einen Parameterrahmen
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])
Ich habe in der unteren Reihe etwas Unangenehmes getan, was die Ursache des Problems war, aber sample.json
hat eine Datenvorlage, die auf die Anzahl der Parameterzeilenn
erweitert wird. Daher habe ich die Methode n-1 Mal kopiert. Infolgedessen wurden "n" Frames erfolgreich in der "Movements" -Taste der json-Daten "j" erstellt. Danach wird die "for" -Anweisung einfach gedreht, um die Daten einzufügen.
…… Aber nachdem ich die Daten eingegeben hatte, war ich beunruhigt über das mysteriöse Ergebnis, dass ** aus irgendeinem Grund alle Zeilen die gleichen Daten haben **.
Nach einigem Debuggen stellte ich fest, dass jede Eingabe jede Zeile neu schreibt, was bedeutet, dass ** jede Zeile auf dieselben Daten verweist **. Selbst wenn sich die scheinbaren Daten in der Zeile "n" befinden, beziehen sich alle auf nur eine Daten, und wenn eine geändert wird, sind alle Daten betroffen.
Warum ist das passiert?
Bei Typen wie "int" und "str" wird eine Variable mit "=", wenn Sie Änderungen vornehmen, als "eine andere Variable" betrachtet und eine ID zugewiesen, jedoch "list" Wenn Sie nach dem Kopieren der Variablen mit =
bearbeiten (tatsächlich konnte sie nicht kopiert werden), werden die Originaldaten bearbeitet. Ich wusste es als Wissen, aber so war es auch "diktieren". Die einzige Lösung besteht darin, die Variablen mit einer als Hardcopy bezeichneten Technik zu kopieren.
#Auszug aus Parametern aus csv
params = []
for row in c:
points.append(row)
n = len(params)
#Laden Sie json und sichern Sie einen Parameterrahmen
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)
In diesem Fall musste es "Deepcopy" (tiefe Kopie) statt nur "Kopie" (flache Kopie) sein.
Es gibt ein Modul namens "pyinstaller", das es in eine Exe verwandelt, damit auch Leute, die kein Python haben, es ausführen können. Als ich versuchte, dies zu "pip", konnte ich es aufgrund eines Fehlers nicht installieren, und wenn ich herumging, konnte ich einfach die Version von pip ("20" → "18") herabstufen, so dass es mir gelang. Als ich jetzt versuchte, es zu reproduzieren, war aus irgendeinem Grund sogar der neueste Pip erfolgreich, sodass der Fehler nicht reproduziert werden kann. Es tut mir Leid.
Also habe ich es mit pyinstaller
sicher zu einer Exe gemacht, aber selbst wenn ich es laufen lasse, endet es sofort. Es spuckt nicht einmal den ersten "Druck" aus, den ich zum Debuggen eingegeben habe, daher scheint es zum Zeitpunkt des "Imports" ein Problem zu geben. Also werde ich nacheinander Hexen für die folgenden Module jagen, die ich tatsächlich eingesetzt habe.
import json
import pprint
import csv
import cmath
import math
import numpy as np
import copy
import os
Infolgedessen wurde es durch "numpy" verursacht. Glücklicherweise habe ich den Teil, der numpy benötigte, nicht im Programm verwendet (ich habe np.pi
verwendet, aber ich brauche ihn nicht mehr), also habe ich das Modul einfach gelöscht. Wenn Sie ein Programm ausführen müssen, das numpy verwendet, um genau zu berechnen, denken Sie noch einmal darüber nach ...
Es tut mir leid, dass es viele Inhalte gibt, die "Ich habe es geschafft, aber ich habe es nicht verstanden", aber ich werde immer mehr vergessen, wenn ich solche Dinge nicht sammle, also habe ich es für mich selbst geschrieben. Ich hatte bis jetzt Angst, so etwas zu überspringen, also werde ich von nun an aktiv Programmaufzeichnungen wie dieses Tagebuch schreiben.
Es ist ein ganz persönliches Werkzeug, daher denke ich, dass es für niemanden nützlich ist, aber vorerst.
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.Geladener json")
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("Die Arbeit abgeschlossen")
end = input()
Recommended Posts