Ho chiesto all'IA di scrivere un asyncio python per scaricare le immagini in modo asincrono.
Prova a scaricare l'immagine, non so come scrivere il file binario dell'immagine direttamente nella tabella JMP senza salvarlo.
Grazie Esperti!
In JMP 18, solo JSL può scrivere script che inseriscano immagini nella tabella.
In precedenza avevo avvisato l'IA di chiamare JSL in questo modo
jmp.run_jsl = '''
dt = Data Table("ImageTable");
dt[{i + 1}, "Image"] = New Image(Open("{data_url}"));
'''
Qualcuno che prova a capirci qualcosa: il testo bianco è python. Il testo rosso è jsl. Il formato python sostituisce {} nella stringa jsl rossa (delimitata da virgolette triple) con i due parametri. base64data sono i dati binari di un file png o jpg, codificati come base64, che è ciò di cui ha bisogno newimage.
L'unica cosa che mi sorprende è la fusione delle due lingue, anche se lala ha suggerito una soluzione quasi corretta nel post successivo.
Ho chiesto all'IA e ho ottenuto l'analisi:(grok3)
Di seguito è riportata una spiegazione dettagliata in inglese del segmento di codice che gestisce la scrittura dei dati dell'immagine scaricata in una tabella dati JMP:
# 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("Tutte le immagini sono state scritte nella tabella JMP!")
Spiegazione riga per riga
per i, (url, image_data) in enumerate(risultati):
results è un elenco di tuple restituite da asyncio.gather(*tasks), dove ogni tupla contiene (url, image_data).
url è l'URL di origine dell'immagine (una stringa).
image_data sono i dati binari dell'immagine (byte), oppure None se il download non è riuscito.
enumerate(results) fornisce un indice i (a partire da 0) per ogni tupla, che verrà utilizzato per specificare la riga nella tabella dati JMP.
Questa riga scorre tutti i risultati del download per preparare la scrittura di dati validi nella tabella.
se image_data:
Controlla se image_data non è None, assicurando che vengano elaborate solo le immagini scaricate correttamente.
Se il download non riesce (image_data è None), il ciclo passa all'iterazione successiva, evitando errori nei passaggi successivi.
dt["URL"][i] = URL
dt è l'oggetto tabella dati JMP creato in precedenza con jmp.DataTable("ImageTable").
dt["URL"] accede alla colonna "URL" nella tabella dati, che ha il tipo di dati jmp.DataType.Character (tipo di carattere).
dt["URL"][i] assegna l'URL (l'indirizzo sorgente dell'immagine) alla i-esima riga (indicizzazione basata su 0) della colonna "URL".
Questo passaggio utilizza direttamente l'API Python JMP per impostare il valore della cella, registrando l'origine dell'immagine.
base64_data = base64.b64encode(dati_immagine).decode('utf-8')
base64.b64encode(dati_immagine):
Codifica i dati binari dell'immagine (image_data, un oggetto byte) nel formato base64, restituendo una stringa di byte.
Base64 è un metodo per convertire dati binari in una stringa ASCII, adatto ad ambienti basati su testo.
.decode('utf-8'):
Decodifica la stringa di byte base64 in una stringa codificata UTF-8, producendo una rappresentazione in testo normale base64 (ad esempio, "iVBORw0KGgo...").
Questo passaggio converte i dati binari dell'immagine in un formato stringa che JSL può elaborare.
codice jsl = '''...'''
Definisce uno script JSL (JMP Scripting Language) come una stringa, che creerà un oggetto immagine e lo assegnerà alla tabella dati.
Contenuto della sceneggiatura:
dt = Data Table("ImageTable");
dt[{} , "Image"] = New Image(CharToBlob("{}", "base64"));dt = Tabella dati("TabellaImmagine");:
Recupera la tabella dati "ImageTable" in JSL, assicurando che venga individuata la tabella corretta.
dt[{} , "Immagine"]:
{} è un segnaposto che verrà sostituito da i + 1, che rappresenta il numero di riga (JSL utilizza l'indicizzazione basata su 1, quindi viene utilizzato i + 1).
"Immagine" specifica il nome della colonna di destinazione.
Nuova immagine(CharToBlob("{}", "base64")):
{NS} ...
Converte la stringa codificata in base64 (sostituita da base64_data nel secondo {}) in dati binari (un Blob).
"base64" indica a JSL che la stringa di input è in formato base64.
Nuova immagine(...):
Crea un oggetto immagine dai dati binari, compatibile con il tipo di colonna "Expression" di JMP.
.format(i + 1, base64_data):
Utilizza la formattazione stringa di Python per inserire i + 1 (numero di riga) e base64_data (stringa base64) nello script JSL.
Esempio: se i = 0 e base64_data = "iVBORw0KGgo...", il jsl_code risultante diventa:
dt = Data Table("ImageTable");
dt[1 , "Image"] = New Image(CharToBlob("iVBORw0KGgo...", "base64"));
jmp.run_jsl(codice_jsl)
jmp.run_jsl è una funzione JMP Python API che esegue lo script JSL.
Passa il jsl_code generato a JMP, eseguendo quanto segue:
Inserisce un oggetto immagine nella colonna "Immagine" alla riga i + 1 della tabella dati "ImageTable".
L'oggetto immagine è derivato da base64_data e verrà visualizzato come immagine visualizzabile in JMP.
print("所有图片已写入 JMP 表格!")
Una volta completato il ciclo, viene visualizzato un messaggio in cinese: "Tutte le immagini sono state scritte nella tabella JMP!"
Si tratta di una semplice notifica di stato per confermare il completamento dell'operazione.
Come funziona
Flusso di dati:
Recupera l'URL e i dati immagine per ciascuna immagine dai risultati.
Scrive l'URL direttamente nella colonna "URL".
Codifica image_data in una stringa base64.
Utilizza JSL per convertire la stringa base64 in un oggetto immagine e lo scrive nella colonna "Immagine".
Tecnologie chiave:
asyncio: gestisce i download asincroni delle immagini.
base64: codifica i dati binari in una stringa.
JSL: utilizza CharToBlob e New Image per elaborare le immagini in JMP.
API Python JMP: collega Python e JSL tramite jmp.run_jsl.
Note:
La colonna "Immagine" deve essere di tipo jmp.DataType.Expression per memorizzare gli oggetti immagine.
JSL utilizza l'indicizzazione delle righe a partire da 1, mentre l'enumerazione di Python è a partire da 0, quindi i + 1.
Salta l'elaborazione se image_data è None per evitare errori.
Potenziali miglioramenti
Gestione degli errori: aggiungere un blocco try-except attorno a jmp.run_jsl(jsl_code) per rilevare gli errori di esecuzione JSL.
Prestazioni: per un numero elevato di immagini, esegui JSL in batch anziché chiamate riga per riga.
Debug: registra base64_data o jsl_code per la risoluzione dei problemi.
Questo codice scrive correttamente i dati dell'immagine dalla memoria in una tabella dati JMP senza salvarli su disco.
Ho provato ripetutamente la velocità di download asincrona di Asyncio di Python, molto più veloce della nuova Multi HTTP Request() di JSL.