{"id":7412,"date":"2022-03-21T16:35:15","date_gmt":"2022-03-21T15:35:15","guid":{"rendered":"https:\/\/www.mathweb.fr\/euclide\/?p=7412"},"modified":"2024-12-17T16:28:33","modified_gmt":"2024-12-17T15:28:33","slug":"ticket-de-caisse-et-python-extraire-les-donnees","status":"publish","type":"post","link":"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/","title":{"rendered":"Ticket de caisse et Python: extraire les donn\u00e9es"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Comment extraire les donn\u00e9es d&rsquo;un ticket de caisse \u00e0 l&rsquo;aide Python ? C&rsquo;est la question que je me suis pos\u00e9e alors que je souhaitais analyser l&rsquo;\u00e9volution des prix des articles que j&rsquo;ai l&rsquo;habitude d&rsquo;acheter dans le supermarch\u00e9 \u00e0 c\u00f4t\u00e9 de chez moi.<\/p>\n\n\n\n<!--more-->\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_87 counter-hierarchy ez-toc-counter ez-toc-white ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Au menu sur cette page...<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#Ticket_de_caisse_et_Python_preliminaires\" >Ticket de caisse et Python: pr\u00e9liminaires<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#Ticket_de_caisse_et_Python_le_projet\" >Ticket de caisse et Python: le projet<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#Scanner_le_ticket_de_caisse\" >Scanner le ticket de caisse<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#Extraire_les_donnees\" >Extraire les donn\u00e9es<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#Extraction_des_donnees_utiles\" >Extraction des donn\u00e9es utiles<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#Sauvegarde_dans_une_base_de_donnees_des_donnees_du_ticket_avec_Python\" >Sauvegarde dans une base de donn\u00e9es des donn\u00e9es du ticket avec Python<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#Creation_de_la_base_de_donnees_et_de_la_table_des_produits\" >Cr\u00e9ation de la base de donn\u00e9es et de la table des produits<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#Creations_de_la_table_des_prix\" >Cr\u00e9ations de la table des prix<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#Remarque_sur_les_doublons\" >Remarque sur les doublons<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Ticket_de_caisse_et_Python_preliminaires\"><\/span>Ticket de caisse et Python: pr\u00e9liminaires<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Au d\u00e9but, comme tout le monde je crois, j&rsquo;ai fait quelques recherches sur internet sur la fa\u00e7on dont on pouvait extraire les donn\u00e9es d&rsquo;un ticket de caisse. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je suis tomb\u00e9 sur des pages et des articles parlant pour la plupart du module <em>tesseract<\/em>. J&rsquo;ai donc voulu le tester.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Malheureusement, les multiples essais ne furent pas concluant du tout&#8230; Ils \u00e9taient m\u00eame \u00e0 chier! Et pour que je dise cela, c&rsquo;est que c&rsquo;\u00e9tait r\u00e9ellement le cas&#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Et puis, \u00e0 force de chercher, je suis tomb\u00e9 sur un site plut\u00f4t int\u00e9ressant: <a href=\"https:\/\/asprise.com\/royalty-free-library\/python-ocr-api-overview.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/asprise.com\/royalty-free-library\/python-ocr-api-overview.html<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je ne vais pas vous mentir, je n&rsquo;ai pas encore test\u00e9 le module pr\u00e9sent\u00e9 sur cette derni\u00e8re page (<strong>asprise_ocr<\/strong>), mais j&rsquo;ai test\u00e9 avec succ\u00e8s une API de <em>asprise<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est la solution que je vais vous pr\u00e9senter ici.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Ticket_de_caisse_et_Python_le_projet\"><\/span>Ticket de caisse et Python: le projet<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Scanner_le_ticket_de_caisse\"><\/span>Scanner le ticket de caisse<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bien \u00e9videmment, il faut avant tout scanner (ou prendre en photo, je pense que \u00e7a fonctionnerait bien aussi) le ticket de caisse.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le mien est le suivant:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/ticket.png\" data-fancybox=\"gallery\"><img loading=\"lazy\" decoding=\"async\" width=\"146\" height=\"300\" src=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/ticket-146x300.png\" alt=\"ticket caisse Python extraire donn\u00e9es\" class=\"wp-image-7413\" srcset=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/ticket-146x300.png 146w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/ticket-300x616.png 300w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/ticket-600x1231.png 600w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/ticket-499x1024.png 499w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/ticket-768x1576.png 768w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/ticket-749x1536.png 749w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/ticket-998x2048.png 998w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/ticket.png 1766w\" sizes=\"auto, (max-width: 146px) 100vw, 146px\" \/><\/a><figcaption class=\"wp-element-caption\">Mon ticket de caisse cobaye<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Extraire_les_donnees\"><\/span>Extraire les donn\u00e9es<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Je vais donc passer par l&rsquo;API de <em>asprise <\/em>(promis, je n&rsquo;ai pas d&rsquo;actions chez eux !&#8230; Non, je dis \u00e7a parce que c&rsquo;est tout de m\u00eame la quatri\u00e8me fois que j&rsquo;\u00e9cris ce nom).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cette API extrait au format <em>json<\/em> les donn\u00e9es.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import requests\n\ntry:\n    with open('ticket.json','r') as f:\n        data = f.read()\n    #pass\nexcept IOError:\n    receiptOcrEndpoint = 'https:\/\/ocr.asprise.com\/api\/v1\/receipt'\n    imageFile = \"ticket.png\" # nom du scan du ticket\n    r = requests.post(receiptOcrEndpoint, data = { \\\n        'client_id': 'TEST', \\\n        'recognizer': 'auto', \\\n        'ref_no': 'ocr_python_123', \\\n    }, \\\n    files = {\"file\": open(imageFile, \"rb\")})\n    \n    with open('ticket.json' , 'w' , encoding='utf-8') as f:\n        f.write( r.text )\n    \n    data = r.text\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Il a fallu ici que j&rsquo;use d&rsquo;astuces car l&rsquo;API ne permet pas de d\u00e9passer un certain quota de scans par heure. Comme \u00e0 mes d\u00e9buts, je t\u00e2tonnais, j&rsquo;ai bien entendu d\u00e9pass\u00e9 ce quota! Il a donc fallu que je sauvegarde les r\u00e9sultats du scan, qui ne changeaient pas d&rsquo;une fois \u00e0 l&rsquo;autre.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bon, voil\u00e0 une bonne chose de faite! Je fichier ainsi obtenu est le suivant:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"ocr_type\" : \"receipts\",\n  \"request_id\" : \"******************\",\n  \"ref_no\" : \"ocr_python_123\",\n  \"file_name\" : \"ticket.png\",\n  \"request_received_on\" : 1647708136937,\n  \"success\" : true,\n  \"image_width\" : 1766,\n  \"image_height\" : 3624,\n  \"image_rotation\" : 0,\n  \"recognition_completed_on\" : 1647708137948,\n  \"receipts\" : &#91; {\n    \"merchant_name\" : \"*MAGGI SOUPE DESHY:.\",\n    \"merchant_address\" : null,\n    \"merchant_phone\" : null,\n    \"merchant_website\" : null,\n    \"merchant_tax_reg_no\" : null,\n    \"merchant_company_reg_no\" : null,\n    \"region\" : null,\n    \"mall\" : null,\n    \"country\" : \"FR\",\n    \"receipt_no\" : null,\n    \"date\" : \"2035-03-02\",\n    \"time\" : null,\n    \"items\" : &#91; {\n      \"amount\" : 3.35,\n      \"description\" : \"MMM SSON SAVOIE NO..2\",\n      \"flags\" : \"\",\n      \"qty\" : null,\n      \"remarks\" : null,\n      \"unitPrice\" : null\n    }, {\n      \"amount\" : 1.67,\n      \"description\" : \"AUC ESS JBON SUP D..2\",\n      \"flags\" : \"\",\n      \"qty\" : null,\n      \"remarks\" : null,\n      \"unitPrice\" : null\n    }, {\n      \"amount\" : 4.45,\n      \"description\" : \"MILKA PATE A TARTIN..2\",\n      \"flags\" : \"\",\n      \"qty\" : null,\n      \"remarks\" : null,\n      \"unitPrice\" : null\n    }, {\n      \"amount\" : 2.09,\n      \"description\" : \"PETIT NAVIRE MAQUE..2\",\n      \"flags\" : \"\",\n      \"qty\" : null,\n      \"remarks\" : null,\n      \"unitPrice\" : null\n    }, {\n      \"amount\" : 30,\n      \"description\" : \"AUCHAN CREME FL\",\n      \"flags\" : \"\",\n      \"qty\" : null,\n      \"remarks\" : null,\n      \"unitPrice\" : null\n    } ],\n    \"currency\" : \"EUR\",\n    \"total\" : null,\n    \"subtotal\" : null,\n    \"tax\" : null,\n    \"service_charge\" : null,\n    \"tip\" : null,\n    \"payment_method\" : null,\n    \"payment_details\" : null,\n    \"credit_card_type\" : null,\n    \"credit_card_number\" : null,\n    \"ocr_text\" : \" *MAGGI SOUPE DESHY:.\\n *LAITIERE MOUSSE CH..\\n TASSIMO L OR CAFE L.\\n *MMM SSON SAVOIE NO..    2*3,35\\n AUC OEUFS DJP SANS\\n *AUC ESS JBON SUP D..    2*1,67\\n *MADRANGE PALET DIA..\\n *CHARAL CARPACCIO B..\\n *BONDUELLE CAROT RA..\\n MILKA PATE A TARTIN..    2*4,45\\n *JOCKEY STRACCIATEL..\\n * AUCHAN POELEE CAMP..\\n *LOTUS GAUFRES DE L..\\n *AUCHAN POELEE THAI..\\n *AUCHAN TAGLIATELLE..\\n *MOUSLINE PUREE NAT..\\n BONNE MAMAN FRAMBOI..\\n AUCHAN CORNICHONS F..\\n *JACQ P MAXI TR NAT..\\n *AUC BRIOCHE TRANCH..\\n *LOTUS GAUFRES DE L..\\n * AUC BRIOCHE TRANCH.\\n *MAGGI SOUPE DESHY..\\n VAHINE VANILL ARTIF..\\n *PETIT NAVIRE MAQUE..     2*2,09\\n *AUC YAOURT LES MIX..\\n *MONT BLANC CREME D..\\n *AUCHAN CREME FL 30.\\n *AUCHAN POIS CHICHE..\\n *LE VIENNOIS CAFE 4..\\n *VIENNOIS VANILLE C..\\n *POULET ROTI ISSU D..\\n *LAITIERE POT CREME..\\n *COEUR DE LAITUE X3..\\n *MAGGI SOUPE TOMATE..\\n AUCHAN LARDONS NATU..\",\n    \"ocr_confidence\" : 96.76,\n    \"width\" : 1248,\n    \"height\" : 3551,\n    \"avg_char_width\" : null,\n    \"avg_line_height\" : null,\n    \"source_locations\" : {\n      \"date\" : &#91; &#91; {\n        \"x\" : 1020,\n        \"y\" : 324\n      }, {\n        \"x\" : 1274,\n        \"y\" : 324\n      }, {\n        \"x\" : 1274,\n        \"y\" : 410\n      }, {\n        \"x\" : 1020,\n        \"y\" : 410\n      } ] ],\n      \"doc\" : &#91; &#91; {\n        \"x\" : -35,\n        \"y\" : -149\n      }, {\n        \"x\" : 1337,\n        \"y\" : -149\n      }, {\n        \"x\" : 1337,\n        \"y\" : 3756\n      }, {\n        \"x\" : -35,\n        \"y\" : 3756\n      } ] ],\n      \"merchant_name\" : &#91; &#91; {\n        \"x\" : -13,\n        \"y\" : 24\n      }, {\n        \"x\" : 896,\n        \"y\" : 24\n      }, {\n        \"x\" : 896,\n        \"y\" : 110\n      }, {\n        \"x\" : -13,\n        \"y\" : 110\n      } ] ]\n    }\n  }, {\n    \"merchant_name\" : \"1,56\",\n    \"merchant_address\" : null,\n    \"merchant_phone\" : null,\n    \"merchant_website\" : null,\n    \"merchant_tax_reg_no\" : null,\n    \"merchant_company_reg_no\" : null,\n    \"region\" : null,\n    \"mall\" : null,\n    \"country\" : \"FR\",\n    \"receipt_no\" : null,\n    \"date\" : null,\n    \"time\" : null,\n    \"items\" : null,\n    \"currency\" : \"EUR\",\n    \"total\" : null,\n    \"subtotal\" : null,\n    \"tax\" : null,\n    \"service_charge\" : null,\n    \"tip\" : null,\n    \"payment_method\" : null,\n    \"payment_details\" : null,\n    \"credit_card_type\" : null,\n    \"credit_card_number\" : null,\n    \"ocr_text\" : \"  1,56\\n  1,53\\n 6,05\\n 6,70\\n  1,97\\n 3,34\\n 3,99\\n  5,10\\n 2,25\\n 8,90\\n  1,93\\n  3,39\\n  3,17\\n  4,06\\n  4,06\\n  1,10\\n  2,37\\n  1,82\\n  1,99\\n  2,10\\n  3,17\\n  2,10\\n  1,56\\n  2,85\\n  4,18\\n  2,76\\n  2,17\\n  2,33\\n  0,61\\n  1,26\\n  1,52\\n  8,19\\n  1,85\\n  1,00\\n  1,30\\n  2,55\",\n    \"ocr_confidence\" : 97.00,\n    \"width\" : 284,\n    \"height\" : 3558,\n    \"avg_char_width\" : null,\n    \"avg_line_height\" : null,\n    \"source_locations\" : {\n      \"doc\" : &#91; &#91; {\n        \"x\" : 1479,\n        \"y\" : -164\n      }, {\n        \"x\" : 1792,\n        \"y\" : -164\n      }, {\n        \"x\" : 1792,\n        \"y\" : 3748\n      }, {\n        \"x\" : 1479,\n        \"y\" : 3748\n      } ] ],\n      \"merchant_name\" : &#91; &#91; {\n        \"x\" : 1544,\n        \"y\" : 16\n      }, {\n        \"x\" : 1702,\n        \"y\" : 10\n      }, {\n        \"x\" : 1706,\n        \"y\" : 111\n      }, {\n        \"x\" : 1548,\n        \"y\" : 117\n      } ] ]\n    }\n  } ]\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On est d&rsquo;accord: c&rsquo;est carr\u00e9ment indigeste! Il faut donc demander \u00e0 Python de trier tout \u00e7a&#8230;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Extraction_des_donnees_utiles\"><\/span>Extraction des donn\u00e9es utiles<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Il y a pas mal de choses inutiles dans le fichier <em>json<\/em>, et en plus, les donn\u00e9es ne sont pas toutes correctes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mais fort heureusement, les donn\u00e9es utiles sont justes, et se trouvent dans les champs \u00ab\u00a0ocr_text\u00a0\u00bb.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Comme on doit analyser un fichier <em>json<\/em>, je vais importer le module Python \u00e9ponyme.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import json\n\nobj_python = json.loads(data)\n\nliste_articles = list()\nliste_prix = list()\ntmp = True\n\nfor key,value in obj_python.items():\n    if key == 'receipts':\n        for i in value:\n            for cle,valeur in i.items():\n                if cle == 'ocr_text':\n                    if tmp:\n                        liste_articles = valeur.split('\\n')\n                        tmp = False\n                    else: liste_prix = valeur.split('\\n')\n\nliste = {}\n\nfor i in range( len(liste_articles) ):\n    if liste_articles[i][1] == '*':\n        cle = liste_articles[i][2:]\n    else:\n        cle = liste_articles[i][1:]\n        \n    L = cle.split('  ')\n    if len(L) &lt; 2:\n        liste[ cle ] = liste_prix[i].replace(' ','')\n    else:\n        LL = L[-1].split('*')\n        prix = LL[-1]\n        cle = L[0]\n        liste[ cle ] = prix\n        \nfor key,value in liste.items():\n    print('{:&lt;25} : {:&lt;5}'.format(key,value))\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">L\u00e0, j&rsquo;ai vachement bidouill\u00e9 quand-m\u00eame! Tout \u00e7a pour arriver \u00e0 ceci:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MAGGI SOUPE DESHY:.       : 1,56 \nLAITIERE MOUSSE CH..      : 1,53 \nTASSIMO L OR CAFE L.      : 6,05 \nMMM SSON SAVOIE NO..      : 3,35 \nAUC OEUFS DJP SANS        : 1,97 \nAUC ESS JBON SUP D..      : 1,67 \nMADRANGE PALET DIA..      : 3,99 \nCHARAL CARPACCIO B..      : 5,10 \nBONDUELLE CAROT RA..      : 2,25 \nMILKA PATE A TARTIN..     : 4,45 \nJOCKEY STRACCIATEL..      : 1,93 \n AUCHAN POELEE CAMP..     : 3,39 \nLOTUS GAUFRES DE L..      : 3,17 \nAUCHAN POELEE THAI..      : 4,06 \nAUCHAN TAGLIATELLE..      : 4,06 \nMOUSLINE PUREE NAT..      : 1,10 \nBONNE MAMAN FRAMBOI..     : 2,37 \nAUCHAN CORNICHONS F..     : 1,82 \nJACQ P MAXI TR NAT..      : 1,99 \nAUC BRIOCHE TRANCH..      : 2,10 \n AUC BRIOCHE TRANCH.      : 2,10 \nMAGGI SOUPE DESHY..       : 1,56 \nVAHINE VANILL ARTIF..     : 2,85 \nPETIT NAVIRE MAQUE..      : 2,09 \nAUC YAOURT LES MIX..      : 2,76 \nMONT BLANC CREME D..      : 2,17 \nAUCHAN CREME FL 30.       : 2,33 \nAUCHAN POIS CHICHE..      : 0,61 \nLE VIENNOIS CAFE 4..      : 1,26 \nVIENNOIS VANILLE C..      : 1,52 \nPOULET ROTI ISSU D..      : 8,19 \nLAITIERE POT CREME..      : 1,85 \nCOEUR DE LAITUE X3..      : 1,00 \nMAGGI SOUPE TOMATE..      : 1,30 \nAUCHAN LARDONS NATU..     : 2,55 <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Avouez que c&rsquo;est pas d\u00e9gueu quand-m\u00eame hein ?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Comme mon intention est d&rsquo;exploiter les prix \u00e0 des fins de comparaison, je vais transformer les cha\u00eenes de caract\u00e8res donnant les prix en <em>float<\/em>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">for key,value in liste.items():\n    liste[ key ] = float( value.replace(',','.') )<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Sauvegarde_dans_une_base_de_donnees_des_donnees_du_ticket_avec_Python\"><\/span>Sauvegarde dans une base de donn\u00e9es des donn\u00e9es du ticket avec Python<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Creation_de_la_base_de_donnees_et_de_la_table_des_produits\"><\/span>Cr\u00e9ation de la base de donn\u00e9es et de la table des produits<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Voil\u00e0! J&rsquo;ai un dictionnaire avec mes prix. Il ne reste plus qu&rsquo;\u00e0 les enregistrer dans une base de donn\u00e9es <em>sqlite<\/em> ou <em>MySql<\/em>. Pour moi, ce sera <em>M<span style=\"text-decoration: underline;\">y<\/span>Sql<\/em> car j&rsquo;utilise MySql dans le cadre de mon travail. J&rsquo;ai donc plus l&rsquo;habitude&#8230; Mais sinon, <em>sqlite3<\/em> est tr\u00e8s bien!<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">conn = mysql.connector.connect(host='localhost', user='root', password='')\ncursor = conn.cursor()\n\n# on se connecte \u00e0 la base de donn\u00e9es\n\ndef create_database(cursor):\n    try:\n        cursor.execute(\n            \"CREATE DATABASE auchan DEFAULT CHARACTER SET 'utf8'\")\n    except mysql.connector.Error as err:\n        print(\"Failed creating database: {}\".format(err))\n        exit(1)\n\ntry:\n    cursor.execute(\"USE auchan\")\nexcept mysql.connector.Error:\n    create_database(cursor)\n    conn.database = 'auchan'\n\n# On cr\u00e9e la table 'produits' si elle n'existe pas\n\ntable = (\n    \"CREATE TABLE IF NOT EXISTS `produits` (\"\n    \"  `idProduit` int(3) NOT NULL AUTO_INCREMENT,\"\n    \"  `description` varchar(25) UNIQUE,\"\n    \"  PRIMARY KEY (`idProduit`) \"\n    \") ENGINE=InnoDB\")\n\ncursor.execute(table)\n\n# On ins\u00e8re les produits s'ils n'existent pas\n\nfor key,value in liste.items():\n    request = (\"INSERT IGNORE INTO produits (description) VALUES ('{}')\".format(key))\n    cursor.execute(request)\n    conn.commit()\n    \ncursor.close()\nconn.close()<\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"505\" height=\"483\" src=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/image-4.png\" alt=\"ticket python base de donn\u00e9es\" class=\"wp-image-7416\" srcset=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/image-4.png 505w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/image-4-300x287.png 300w\" sizes=\"auto, (max-width: 505px) 100vw, 505px\" \/><figcaption class=\"wp-element-caption\">Table des produits obtenue<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Creations_de_la_table_des_prix\"><\/span>Cr\u00e9ations de la table des prix<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Il faut maintenant ins\u00e9rer tous les prix dans une autre table, que l&rsquo;on va nommer \u00ab\u00a0prix\u00a0\u00bb.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># cr\u00e9ation de la table des prix\n\nprix = (\n    \"CREATE TABLE IF NOT EXISTS `prix` (\"\n    \"  `idPrix` int(3) NOT NULL AUTO_INCREMENT,\"\n    \"  `date` date NOT NULL,\"\n    \"  `idProduit` int(3) NOT NULL,\"\n    \"  `valeur` decimal(3,2) NOT NULL,\"\n    \"  UNIQUE (`date`,`idProduit`) , PRIMARY KEY (`idPrix`)\"\n    \") ENGINE=InnoDB\")\n\ncursor.execute(prix)\n\n# insertion des prix\n\nfor key, value in liste.items():\n    request = (\"INSERT IGNORE INTO prix (date,idProduit,valeur) VALUES (DATE(NOW()), (SELECT (idProduit) FROM produits WHERE description = '{}'),{})\".format(key,value))\n    cursor.execute(request)\n    conn.commit()<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Et voil\u00e0 ! Notre table est pr\u00eate!<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"509\" height=\"485\" src=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/image-3.png\" alt=\"base de donn\u00e9es prix python ticket\" class=\"wp-image-7415\" srcset=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/image-3.png 509w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/image-3-300x286.png 300w\" sizes=\"auto, (max-width: 509px) 100vw, 509px\" \/><figcaption class=\"wp-element-caption\">Table des prix obtenue<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Remarque_sur_les_doublons\"><\/span>Remarque sur les doublons<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Vous avez sans doute remarqu\u00e9 qu&rsquo;\u00e0 la cr\u00e9ation des tables, j&rsquo;ai utilis\u00e9 le mot-cl\u00e9 <em>UNIQUE<\/em>; et vous avez aussi remarqu\u00e9 que lors de l&rsquo;insertion des donn\u00e9es, j&rsquo;ai utilis\u00e9 le mot-cl\u00e9 <em>IGNORE<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ceci est pour \u00e9viter d&rsquo;ins\u00e9rer des doublons. Il serait en effet dommage d&rsquo;avoir plusieurs entr\u00e9es identiques.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comment extraire les donn\u00e9es d&rsquo;un ticket de caisse \u00e0 l&rsquo;aide Python ? C&rsquo;est la question que je me suis pos\u00e9e alors que je souhaitais analyser l&rsquo;\u00e9volution des prix des articles que j&rsquo;ai l&rsquo;habitude d&rsquo;acheter dans le supermarch\u00e9 \u00e0 c\u00f4t\u00e9 de chez moi.<\/p>\n","protected":false},"author":1,"featured_media":7417,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[136],"class_list":["post-7412","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","tag-sql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Ticket de caisse et Python: extraire les donn\u00e9es - Mathweb.fr<\/title>\n<meta name=\"description\" content=\"Comment extraire les donn\u00e9es d&#039;un ticket de caisse \u00e0 l&#039;aide Python ? Nous allons voir cela ensemble sur un exemple concret.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ticket de caisse et Python: extraire les donn\u00e9es - Mathweb.fr\" \/>\n<meta property=\"og:description\" content=\"Comment extraire les donn\u00e9es d&#039;un ticket de caisse \u00e0 l&#039;aide Python ? Nous allons voir cela ensemble sur un exemple concret.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/\" \/>\n<meta property=\"og:site_name\" content=\"Mathweb.fr\" \/>\n<meta property=\"article:published_time\" content=\"2022-03-21T15:35:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-12-17T15:28:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/head-articles-python-ticket-caisse.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"740\" \/>\n\t<meta property=\"og:image:height\" content=\"198\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"St\u00e9phane Pasquet\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"St\u00e9phane Pasquet\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2022\\\/03\\\/21\\\/ticket-de-caisse-et-python-extraire-les-donnees\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2022\\\/03\\\/21\\\/ticket-de-caisse-et-python-extraire-les-donnees\\\/\"},\"author\":{\"name\":\"St\u00e9phane Pasquet\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\"},\"headline\":\"Ticket de caisse et Python: extraire les donn\u00e9es\",\"datePublished\":\"2022-03-21T15:35:15+00:00\",\"dateModified\":\"2024-12-17T15:28:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2022\\\/03\\\/21\\\/ticket-de-caisse-et-python-extraire-les-donnees\\\/\"},\"wordCount\":691,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2022\\\/03\\\/21\\\/ticket-de-caisse-et-python-extraire-les-donnees\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/head-articles-python-ticket-caisse.jpg\",\"keywords\":[\"sql\"],\"articleSection\":[\"Python\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2022\\\/03\\\/21\\\/ticket-de-caisse-et-python-extraire-les-donnees\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2022\\\/03\\\/21\\\/ticket-de-caisse-et-python-extraire-les-donnees\\\/\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2022\\\/03\\\/21\\\/ticket-de-caisse-et-python-extraire-les-donnees\\\/\",\"name\":\"Ticket de caisse et Python: extraire les donn\u00e9es - Mathweb.fr\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2022\\\/03\\\/21\\\/ticket-de-caisse-et-python-extraire-les-donnees\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2022\\\/03\\\/21\\\/ticket-de-caisse-et-python-extraire-les-donnees\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/head-articles-python-ticket-caisse.jpg\",\"datePublished\":\"2022-03-21T15:35:15+00:00\",\"dateModified\":\"2024-12-17T15:28:33+00:00\",\"description\":\"Comment extraire les donn\u00e9es d'un ticket de caisse \u00e0 l'aide Python ? Nous allons voir cela ensemble sur un exemple concret.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2022\\\/03\\\/21\\\/ticket-de-caisse-et-python-extraire-les-donnees\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2022\\\/03\\\/21\\\/ticket-de-caisse-et-python-extraire-les-donnees\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2022\\\/03\\\/21\\\/ticket-de-caisse-et-python-extraire-les-donnees\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/head-articles-python-ticket-caisse.jpg\",\"contentUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/head-articles-python-ticket-caisse.jpg\",\"width\":740,\"height\":198,\"caption\":\"ticket caisse python extraire donn\u00e9es\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2022\\\/03\\\/21\\\/ticket-de-caisse-et-python-extraire-les-donnees\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ticket de caisse et Python: extraire les donn\u00e9es\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#website\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/\",\"name\":\"Mathweb.fr\",\"description\":\"Math\u00e9matiques, LaTeX et Python\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\",\"name\":\"St\u00e9phane Pasquet\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\",\"contentUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\",\"width\":74,\"height\":77,\"caption\":\"St\u00e9phane Pasquet\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ticket de caisse et Python: extraire les donn\u00e9es - Mathweb.fr","description":"Comment extraire les donn\u00e9es d'un ticket de caisse \u00e0 l'aide Python ? Nous allons voir cela ensemble sur un exemple concret.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/","og_locale":"fr_FR","og_type":"article","og_title":"Ticket de caisse et Python: extraire les donn\u00e9es - Mathweb.fr","og_description":"Comment extraire les donn\u00e9es d'un ticket de caisse \u00e0 l'aide Python ? Nous allons voir cela ensemble sur un exemple concret.","og_url":"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/","og_site_name":"Mathweb.fr","article_published_time":"2022-03-21T15:35:15+00:00","article_modified_time":"2024-12-17T15:28:33+00:00","og_image":[{"width":740,"height":198,"url":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/head-articles-python-ticket-caisse.jpg","type":"image\/jpeg"}],"author":"St\u00e9phane Pasquet","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"St\u00e9phane Pasquet","Dur\u00e9e de lecture estim\u00e9e":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#article","isPartOf":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/"},"author":{"name":"St\u00e9phane Pasquet","@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69"},"headline":"Ticket de caisse et Python: extraire les donn\u00e9es","datePublished":"2022-03-21T15:35:15+00:00","dateModified":"2024-12-17T15:28:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/"},"wordCount":691,"commentCount":0,"publisher":{"@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69"},"image":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/head-articles-python-ticket-caisse.jpg","keywords":["sql"],"articleSection":["Python"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/","url":"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/","name":"Ticket de caisse et Python: extraire les donn\u00e9es - Mathweb.fr","isPartOf":{"@id":"https:\/\/www.mathweb.fr\/euclide\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#primaryimage"},"image":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/head-articles-python-ticket-caisse.jpg","datePublished":"2022-03-21T15:35:15+00:00","dateModified":"2024-12-17T15:28:33+00:00","description":"Comment extraire les donn\u00e9es d'un ticket de caisse \u00e0 l'aide Python ? Nous allons voir cela ensemble sur un exemple concret.","breadcrumb":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#primaryimage","url":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/head-articles-python-ticket-caisse.jpg","contentUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2022\/03\/head-articles-python-ticket-caisse.jpg","width":740,"height":198,"caption":"ticket caisse python extraire donn\u00e9es"},{"@type":"BreadcrumbList","@id":"https:\/\/www.mathweb.fr\/euclide\/2022\/03\/21\/ticket-de-caisse-et-python-extraire-les-donnees\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.mathweb.fr\/euclide\/"},{"@type":"ListItem","position":2,"name":"Ticket de caisse et Python: extraire les donn\u00e9es"}]},{"@type":"WebSite","@id":"https:\/\/www.mathweb.fr\/euclide\/#website","url":"https:\/\/www.mathweb.fr\/euclide\/","name":"Mathweb.fr","description":"Math\u00e9matiques, LaTeX et Python","publisher":{"@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mathweb.fr\/euclide\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":["Person","Organization"],"@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69","name":"St\u00e9phane Pasquet","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp","url":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp","contentUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp","width":74,"height":77,"caption":"St\u00e9phane Pasquet"},"logo":{"@id":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp"}}]}},"_links":{"self":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/posts\/7412","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/comments?post=7412"}],"version-history":[{"count":0,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/posts\/7412\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/media\/7417"}],"wp:attachment":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/media?parent=7412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/categories?post=7412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/tags?post=7412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}