J'ai demandé à l'IA d'écrire un python asyncio pour télécharger des images de manière asynchrone.
J'essaie de télécharger l'image, je ne sais pas comment écrire le fichier binaire de l'image directement dans la table JMP sans enregistrer.
Merci les experts !
Dans JMP 18, seul JSL peut créer un script pour placer des images dans la table.
J'avais déjà prévenu l'IA d'appeler JSL de cette façon
jmp.run_jsl = '''
dt = Data Table("ImageTable");
dt[{i + 1}, "Image"] = New Image(Open("{data_url}"));
'''
Quelqu'un essaie de comprendre : le texte blanc est en python. le texte rouge est en jsl. le format python remplace le {} dans la chaîne jsl rouge (délimitée par des guillemets triples) par les deux paramètres. les données base64 sont les données binaires d'un fichier png ou jpg, encodées en base64, ce dont newimage a besoin.
La seule partie qui me surprend est le mélange des deux langues, même si lala a suggéré presque la bonne solution dans le prochain post.
J'ai demandé à l'IA et j'ai obtenu l'analyse :(grok3)
Vous trouverez ci-dessous une explication détaillée en anglais du segment de code, qui gère l'écriture des données d'image téléchargées dans une table de données 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("Toutes les images ont été écrites dans la table JMP !")
Explication ligne par ligne
pour i, (url, image_data) dans enumerate(résultats) :
results est une liste de tuples renvoyés par asyncio.gather(*tasks), où chaque tuple contient (url, image_data).
url est l'URL source de l'image (une chaîne).
image_data est les données binaires de l'image (octets), ou None si le téléchargement a échoué.
enumerate(results) fournit un index i (commençant à 0) pour chaque tuple, qui sera utilisé pour spécifier la ligne dans la table de données JMP.
Cette ligne parcourt tous les résultats de téléchargement pour préparer l'écriture de données valides dans la table.
si image_data :
Vérifie si image_data n'est pas None, garantissant que seules les images téléchargées avec succès sont traitées.
Si le téléchargement échoue (image_data est None), la boucle passe à l'itération suivante, évitant ainsi les erreurs dans les étapes suivantes.
dt["URL"][i] = url
dt est l'objet de table de données JMP créé précédemment avec jmp.DataTable("ImageTable").
dt["URL"] accède à la colonne "URL" dans la table de données, qui a le type de données jmp.DataType.Character (type caractère).
dt["URL"][i] attribue l'URL (l'adresse source de l'image) à la i-ème ligne (indexation basée sur 0) de la colonne "URL".
Cette étape utilise directement l'API JMP Python pour définir la valeur de la cellule, en enregistrant l'origine de l'image.
base64_data = base64.b64encode(image_data).decode('utf-8')
base64.b64encode(données_image) :
Encode les données d'image binaires (image_data, un objet d'octets) au format base64, renvoyant une chaîne d'octets.
Base64 est une méthode permettant de convertir des données binaires en une chaîne ASCII, adaptée aux environnements textuels.
.décoder('utf-8'):
Décode la chaîne d'octets en base64 en une chaîne codée en UTF-8, produisant une représentation en texte brut en base64 (par exemple, « iVBORw0KGgo... »).
Cette étape convertit les données d’image binaires en un format de chaîne que JSL peut traiter.
jsl_code = '''...'''
Définit un script JSL (JMP Scripting Language) sous forme de chaîne, qui créera un objet image et l'affectera à la table de données.
Contenu du script :
dt = Data Table("ImageTable");
dt[{} , "Image"] = New Image(CharToBlob("{}", "base64"));dt = Tableau de données("ImageTable");:
Récupère la table de données « ImageTable » dans JSL, en garantissant que la bonne table est ciblée.
dt[{} , "Image"]:
{} est un espace réservé qui sera remplacé par i + 1, représentant le numéro de ligne (JSL utilise une indexation basée sur 1, donc i + 1 est utilisé).
« Image » spécifie le nom de la colonne cible.
Nouvelle image(CharToBlob("{}", "base64")) :
CharToBlob("{}", "base64"):
Convertit la chaîne codée en base64 (remplacée par base64_data dans le deuxième {}) en données binaires (un Blob).
« base64 » indique à JSL que la chaîne d'entrée est au format base64.
Nouvelle image(...):
Crée un objet image à partir des données binaires, compatible avec le type de colonne « Expression » de JMP.
.format(i + 1, données_base64) :
Utilise le formatage de chaîne de Python pour insérer i + 1 (numéro de ligne) et base64_data (chaîne base64) dans le script JSL.
Exemple : Si i = 0 et base64_data = "iVBORw0KGgo...", le jsl_code résultant devient :
dt = Data Table("ImageTable");
dt[1 , "Image"] = New Image(CharToBlob("iVBORw0KGgo...", "base64"));
jmp.run_jsl(code_jsl)
jmp.run_jsl est une fonction API Python JMP qui exécute le script JSL.
Transmet le jsl_code généré à JMP, en exécutant les opérations suivantes :
Insère un objet image dans la colonne « Image » à la ligne i + 1 de la table de données « ImageTable ».
L'objet image est dérivé de base64_data et sera affiché comme une image visible dans JMP.
print ("所有图片已写入 JMP表格!")
Une fois la boucle terminée, imprime un message en chinois : « Toutes les images ont été écrites dans la table JMP ! »
Il s’agit d’une simple notification d’état pour confirmer la fin de l’opération.
Comment ça marche
Flux de données :
Récupère l'URL et les données d'image pour chaque image à partir des résultats.
Écrit l'URL directement dans la colonne « URL ».
Encode image_data dans une chaîne base64.
Utilise JSL pour convertir la chaîne base64 en un objet image et l'écrit dans la colonne « Image ».
Technologies clés :
asyncio : gère les téléchargements d'images asynchrones.
base64 : encode les données binaires dans une chaîne.
JSL : utilise CharToBlob et New Image pour traiter les images dans JMP.
API JMP Python : relie Python et JSL via jmp.run_jsl.
Remarques :
La colonne « Image » doit être de type jmp.DataType.Expression pour stocker des objets image.
JSL utilise une indexation de ligne basée sur 1, tandis que l'énumération de Python est basée sur 0, d'où i + 1.
Ignore le traitement si image_data est None pour éviter les erreurs.
Améliorations potentielles
Gestion des erreurs : ajoutez un bloc try-except autour de jmp.run_jsl(jsl_code) pour détecter les erreurs d’exécution JSL.
Performances : pour un grand nombre d’images, exécution JSL par lots au lieu d’appels ligne par ligne.
Débogage : enregistrez les données base64 ou le code jsl pour le dépannage.
Ce code écrit avec succès les données d'image de la mémoire dans une table de données JMP sans les enregistrer sur le disque.
J'ai essayé à plusieurs reprises la vitesse de téléchargement asynchrone asyncio de Python beaucoup plus rapide que la nouvelle requête HTTP multiple () de JSL.