Ich habe die KI gebeten, ein Python-Asyncio zu schreiben, um Bilder asynchron herunterzuladen.
Versuchen Sie, das Bild herunterzuladen. Ich weiß nicht, wie ich die Binärdatei des Bildes ohne Speichern direkt in die JMP-Tabelle schreiben kann.
Danke, Experten!
In JMP 18 kann nur JSL das Einfügen von Bildern in die Tabelle skripten.
Ich hatte die KI zuvor gewarnt, JSL auf diese Weise aufzurufen
jmp.run_jsl = '''
dt = Data Table("ImageTable");
dt[{i + 1}, "Image"] = New Image(Open("{data_url}"));
'''
Für alle, die es herausfinden möchten: Der weiße Text ist Python. Der rote Text ist JSL. Das Python-Format ersetzt die {} in der roten JSL-Zeichenfolge (durch drei Anführungszeichen getrennt) durch die beiden Parameter. Die Base64-Daten sind die Binärdaten einer PNG- oder JPG-Datei, codiert als Base64, was Newimage benötigt.
Das einzige, was mich überrascht, ist die Mischung der beiden Sprachen, obwohl Lala im nächsten Beitrag fast die richtige Lösung vorgeschlagen hat.
Ich habe die KI gefragt und die Analyse erhalten: (grok3)
Nachfolgend finden Sie eine ausführliche englische Erklärung des Codeabschnitts, der das Schreiben heruntergeladener Bilddaten in eine JMP-Datentabelle übernimmt:
# Write results to JMP data table
for i, (url, image_data) in enumerate(results):
if image_data:
dt["URL"][i] = url
# Encode binary data to base64 and create a Blob object
base64_data = base64.b64encode(image_data).decode('utf-8')
# Create an image object using JSL's CharToBlob
jsl_code = '''
dt = Data Table("ImageTable");
dt[{} , "Image"] = New Image(CharToBlob("{}", "base64"));
'''.format(i + 1, base64_data)
jmp.run_jsl(jsl_code)print("Alle Bilder wurden in die JMP-Tabelle geschrieben!")
Zeilenweise Erklärung
für i, (URL, Bilddaten) in Aufzählung(Ergebnisse):
„Ergebnisse“ ist eine Liste von Tupeln, die von asyncio.gather(*tasks) zurückgegeben werden, wobei jedes Tupel (URL, Bilddaten) enthält.
URL ist die Quell-URL des Bildes (eine Zeichenfolge).
image_data sind die Binärdaten des Bildes (Bytes) oder None, wenn der Download fehlgeschlagen ist.
enumerate(results) stellt für jedes Tupel einen Index i (beginnend bei 0) bereit, der zum Angeben der Zeile in der JMP-Datentabelle verwendet wird.
Diese Zeile durchläuft alle Download-Ergebnisse, um das Schreiben gültiger Daten in die Tabelle vorzubereiten.
wenn Bilddaten:
Überprüft, ob image_data nicht None ist, um sicherzustellen, dass nur erfolgreich heruntergeladene Bilder verarbeitet werden.
Wenn der Download fehlgeschlagen ist (image_data ist None), springt die Schleife zur nächsten Iteration, um Fehler in den nachfolgenden Schritten zu vermeiden.
dt["URL"][i] = URL
dt ist das zuvor mit jmp.DataTable("ImageTable") erstellte JMP-Datentabellenobjekt.
dt["URL"] greift auf die Spalte "URL" in der Datentabelle zu, die den Datentyp jmp.DataType.Character (Zeichentyp) hat.
dt["URL"][i] weist die URL (die Quelladresse des Bildes) der i-ten Zeile (0-basierte Indizierung) der Spalte „URL“ zu.
Dieser Schritt verwendet direkt die JMP Python-API, um den Zellenwert festzulegen und den Ursprung des Bildes aufzuzeichnen.
base64_data = base64.b64encode(Bilddaten).decode('utf-8')
base64.b64encode(Bilddaten):
Codiert die binären Bilddaten (image_data, ein Byte-Objekt) in das Base64-Format und gibt eine Byte-Zeichenfolge zurück.
Base64 ist eine Methode zum Konvertieren binärer Daten in eine ASCII-Zeichenfolge, die für textbasierte Umgebungen geeignet ist.
.decode('utf-8'):
Dekodiert die Base64-Byte-Zeichenfolge in eine UTF-8-kodierte Zeichenfolge und erzeugt eine reine Base64-Textdarstellung (z. B. „iVBORw0KGgo...“).
Dieser Schritt konvertiert die binären Bilddaten in ein Zeichenfolgenformat, das JSL verarbeiten kann.
jsl_code = '''...'''
Definiert ein JSL-Skript (JMP Scripting Language) als Zeichenfolge, das ein Bildobjekt erstellt und es der Datentabelle zuweist.
Skriptinhalt:
dt = Data Table("ImageTable");
dt[{} , "Image"] = New Image(CharToBlob("{}", "base64"));dt = Datentabelle("Bildtabelle");:
Ruft die Datentabelle „ImageTable“ in JSL ab und stellt sicher, dass die richtige Tabelle angesprochen wird.
dt[{} , "Bild"]:
{} ist ein Platzhalter, der durch i + 1 ersetzt wird und die Zeilennummer darstellt (JSL verwendet eine 1-basierte Indizierung, daher wird i + 1 verwendet).
„Image“ gibt den Zielspaltennamen an.
Neues Bild(CharToBlob("{}", "base64")):
CharToBlob("{}", "base64"):
Wandelt den Base64-codierten String (ersetzt durch base64_data im zweiten {}) in Binärdaten (einen Blob) um.
„base64“ zeigt JSL an, dass die Eingabezeichenfolge im Base64-Format vorliegt.
Neues Bild(...):
Erstellt ein Bildobjekt aus den Binärdaten, das mit dem Spaltentyp „Expression“ von JMP kompatibel ist.
.format(i + 1, base64_data):
Verwendet die Zeichenfolgenformatierung von Python, um i + 1 (Zeilennummer) und base64_data (Base64-Zeichenfolge) in das JSL-Skript einzufügen.
Beispiel: Wenn i = 0 und base64_data = "iVBORw0KGgo...", wird der resultierende JSL-Code wie folgt lauten:
dt = Data Table("ImageTable");
dt[1 , "Image"] = New Image(CharToBlob("iVBORw0KGgo...", "base64"));
jmp.run_jsl(jsl_code)
jmp.run_jsl ist eine JMP Python API-Funktion, die das JSL-Skript ausführt.
Übergibt den generierten JSL-Code an JMP und führt Folgendes aus:
Fügt ein Bildobjekt in die Spalte „Image“ in Zeile i + 1 der Datentabelle „ImageTable“ ein.
Das Bildobjekt wird aus den Base64-Daten abgeleitet und als sichtbares Bild in JMP angezeigt.
print("所有图片已写入 JMP 表格!")
Nach Abschluss der Schleife wird eine Meldung auf Chinesisch gedruckt: „Alle Bilder wurden in die JMP-Tabelle geschrieben!“
Dies dient als einfache Statusbenachrichtigung zur Bestätigung des Abschlusses des Vorgangs.
Wie es funktioniert
Datenfluss:
Ruft URL und Bilddaten für jedes Bild aus den Ergebnissen ab.
Schreibt die URL direkt in die Spalte „URL“.
Kodiert Bilddaten in eine Base64-Zeichenfolge.
Wandelt den Base64-String mittels JSL in ein Bildobjekt um und schreibt es in die Spalte „Bild“.
Schlüsseltechnologien:
asyncio: Verarbeitet asynchrone Bilddownloads.
base64: Kodiert Binärdaten in eine Zeichenfolge.
JSL: Verwendet CharToBlob und New Image, um Bilder in JMP zu verarbeiten.
JMP Python API: Überbrückt Python und JSL über jmp.run_jsl.
Hinweise:
Die Spalte „Bild“ muss vom Typ jmp.DataType.Expression sein, um Bildobjekte zu speichern.
JSL verwendet eine 1-basierte Zeilenindizierung, während die Aufzählung von Python 0-basiert ist, daher i + 1.
Überspringt die Verarbeitung, wenn image_data Keine ist, um Fehler zu vermeiden.
Mögliche Verbesserungen
Fehlerbehandlung: Fügen Sie einen Try-Except-Block um jmp.run_jsl(jsl_code) hinzu, um JSL-Ausführungsfehler abzufangen.
Leistung: Bei einer großen Anzahl von Bildern erfolgt die JSL-Ausführung im Batch-Verfahren anstelle von zeilenweisen Aufrufen.
Debuggen: Protokollieren Sie base64_data oder jsl_code zur Fehlerbehebung.
Dieser Code schreibt Bilddaten erfolgreich aus dem Speicher in eine JMP-Datentabelle, ohne sie auf der Festplatte zu speichern.
Ich habe wiederholt versucht, die asynchrone Downloadgeschwindigkeit von Python asyncio viel schneller zu machen als die von JSLs New Multi HTTP Request().