En fait, jusqu'à présent j'écris le code sur Notepad++ et le converti en python.
Que me conseilles tu ? Pycharm ?
En fait, jusqu'à présent j'écris le code sur Notepad++ et le converti en python.
Que me conseilles tu ? Pycharm ?
j'écris le code sur Notepad++ et il me met l'extension .py sur le fichier.
Et je double clique sur le fichier créé.
D'habitude les autres programmes fonctionne.
au fait, oui par pip.
print(result.group(1))
AttributeError: 'NoneType' object has no attribute 'group'
De quelle maniere difinie t on le group ?
là c'est normal car si tu n'adaptes pas le code à ton PDF (en particulier la partie expression régulière) il n'y a aucune chance pour que cela fonctionne.
faire un print(text) pour voir si tu récupères les numéros de factures :
et voir dans tout ce qui est extrait si il y a bien les numéros de facture et voir ce qu'il y a sur les lignes avant et après
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 text = page.get_text() print(text)
Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko
en fait il me recupere trop d'info
Qté
Montant
MAINTENANCE 2022
FA128279
1
Page
Prix Brut
Facture N°:
REFERENCE:
Adresse de livraison
Mode de règlement
Echéance
PRELEVEMENT
J'aurais juste besoin de FA128279
c'est normal c'est tout le texte qui se trouve dans le PDF !
en fait il faut te synchroniser sur MAINTENANCE 2022
tu peux essayer en expression régulière :
Code : Sélectionner tout - Visualiser dans une fenêtre à part result = re.search(r'^MAINTENANCE 2022[\r\n]+(.*)$',text,flags=re.MULTILINE)
Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko
ca a marche, par contre cela ne m'a sorti qu'une facture.
Est il possible de ne pas prendre l'année en compte, soit 2022?
Car l'année prochaine cela ne marchera pas.
Vraiment merci pour ta patience
Bonjour et merci à tous.
Cela fonctionne maintenant très bien.
Est-il possible de ne pas prendre l'année en compte, soit 2022 dans le champs recherché qui est "Maintenance 2022" ?
Car l'année prochaine cela ne marchera pas.
Dernière modification par Invité ; 09/10/2022 à 14h35.
Bonjour,
Je reviens sur ce sujet car j'ai édité un autre PDF et celui-ci n'est pas lu par le programme, pourtant il est bien en mode texte aussi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 File "C:\Users\XXXX\main.py", line 30, in <module> doc = fitz.open(filename) File "C:\Users\XXXX\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\fitz\fitz.py", line 3867, in __init__ raise FileNotFoundError(msg) fitz.fitz.FileNotFoundError: no such file: 'VIRM8-1-200.pdf'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 import os import fitz import re from pathlib import Path #recuperer les données dans un fichier fichier = open('donnees.txt', 'r') cheminFacturesMasse = fichier.readline() cheminFacturesMasse = cheminFacturesMasse.replace('\n', '') cheminFacturesIndividuelles= fichier.readline() cheminFacturesIndividuelles=cheminFacturesIndividuelles.replace('\n', '') variableRecherche= fichier.readline() variableRecherche=variableRecherche.replace('\n', '') fichier.close #Recupere le chemin relatif directory = Path(__file__).parent #print(f"Répertoire de sauvegarde est {directory}") #for filename in os.listdir(directory): #Boucle pour appliquer le code sur tous les fichiers du repertoire for filename in os.listdir(cheminFacturesMasse+"//"): if filename.endswith('.pdf'): doc = fitz.open(filename) print("nb pages : " + str(doc.page_count)) prevNum = -1 for x,page in enumerate(doc,start=0): text=page.get_text() #print(text) #os.system("pause") #result = re.search(r'^MAINTENANCE 2022[\r\n]+(.*)$',text,flags=re.MULTILINE) result = re.search(r'^'+variableRecherche+'[\r\n]+(.*)$',text,flags=re.MULTILINE) #print(result.group(1)) numfacture = result.group(1) if numfacture == prevNum: y=y+1 else: y=0 if not os.path.exists('Factures'): os.makedirs('Factures') doc2 = fitz.open() # on crée un nouveau PDF doc2.insert_pdf(doc,from_page=x-y,to_page=x) #doc2.save("factures" +"//"+ numfacture + ".pdf") doc2.save(cheminFacturesIndividuelles +"//"+ numfacture + ".pdf") prevNum = numfacture #os.system("pause") else: continue
Je ne m'en sors plus.
Le programme fonctionne dorénavant mais quand je créé un exécutable avec "Auto-py-to-exe", il ne fonctionne plus.
Ci-dessous le message d'erreur :
Bonjour
C'est normal. Auto-py-to-exe est une version graphique de pyinstaller. Ce programme ne fait pas une compilation native comme le C peut en faire, mais plutôt une "encapsulation" du code Python, des modules qu'il utilise et de l'interpréteur Python lui-même. Lorsqu'on lance l'exe, il se "déarchive" dans un répertoire temporaire et s'exécute dans celui-ci. La conséquence, c'est que les adresses d'accès à des fichiers non-python doivent souvent être recalculées.
Avec pyinstaller, voilà un petit code qu'on peut placer au début de l'exécution et qui permet ce calcul dans les 2 cas: version ".py" et version ".exe":
Une fois connu le répertoire temporaire, on peut calculer l'adresse d'un fichier non-python (par exemple une image) se trouvant dans l'exe avec os.path.join(REPEXE, image.jpg)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 import sys if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'): # exécution en exe après traitement par pyinstaller (onedir ou onefile) REPEXE = sys._MEIPASS # répertoire (temporaire) des modules REPFICEXE = os.path.dirname(sys.executable) # répertoire de l'exe else: # exécution en .py REPEXE = REPFICEXE = os.path.dirname(os.path.abspath(__file__)) # répertoire du .py exécuté
Pour en connaître plus: voir la doc de pyinstaller:
https://pyinstaller.org/en/stable/ru...formation.html
Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
Mes recettes python: http://www.jpvweb.com
Ce que je ne comprends pas c'est pour le programme fonctionne quand je lance le main.py via l'invite de commande :
Mais ne fonctionne pas quand je double-clique sur le fichier lui même :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Microsoft Windows [version 10.0.19044.2130] (c) Microsoft Corporation. Tous droits réservés. C:\Users\XXXXX>python.exe main.py nb pages : 200
et lorsque je créé son executable via auto.py-to-exe.
Il lance le programme, mais il s'arrete en cours.
Il doit bien lire le dossier, puisqu'il m'indique dans un message d'erreur le nom du fichier ("VIRM8.pdf") qu'il trouve, mais au moment de sa lecture, il me dit qu'il ne le trouve pas. C'est pas cohérent.
Bonjour
Il te faut associer, dans windows, l'extension ".py" au programme dédié à le traiter (Python.exe). Tout comme tu associes un ".docx" à Word ou un ".mp4" à vlc.
Parce que l'instruction os.listdir("c:\X") te donne des noms relatifs au dossier "c:\X" (le nom du dossier n'est pas mis dans le nom renvoyé). Or si ce dossier "c:\X" contient un fichier "VIRM8.pdf", le fichier se nomme en réalité "c:\X\VIRM8.pdf" et non pas "VIRM8.pdf". Mais la variable filename et que tu ouvres via fitz.open(filename) ne contient que "VIRM8.pdf". Si par chance tu te trouves déjà dans "c:\X" quand tu lances le programme ça marchera quand-même (le nom relatif correspond) mais quand tu passes par un exécutable, tu n'es certainement pas à l'endroit où se trouve le fichier.
C'est pourtant pas compliqué de faire print(filename) pour voir ce qui se passe quoi
Ben oui, l'année prochaine cela ne marchera pas. Donc tu regardes l'instruction de jurassic pork et tu l'adaptes à tes contraintes (par exemple tu remplaces "2022" par "année courante" en récupérant cette année courante dans le module "datetime"). On n'est pas non plus là pour tout te faire.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Bonjour,
C'est déjà fait, ca m'indique bien le nom du fichier :C'est pourtant pas compliqué de faire print(filename) pour voir ce qui se passe quoi (Image)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 C:\Users\xxxxx>python.exe main.py VIRM8.pdfCa c'est ok. J'ai tout regroupé dans une variable modifiable à partir d'un fichier txt.Ben oui, l'année prochaine cela ne marchera pas. Donc tu regardes l'instruction de jurassic pork et tu l'adaptes à tes contraintes (par exemple tu remplaces "2022" par "année courante" en récupérant cette année courante dans le module "datetime"). On n'est pas non plus là pour tout te faire.
Ca veut pas rentrer hein?
Ce fichier ne se nomme pas "VIRM8.pdf". Ce que tu vois n'est pas le nom complet du fichier. Parce qu'un nom complet se compose aussi du dossier dans lequel il se trouve.
Bon, dit autrement : si je viens chez-toi, dans ta maison, sur ta machine et que tu me dis "hey, Sve@r, récupère donc le fichier VIRM8.pdf, il va t'intéresser" je te demanderai "ok, et il est où ce fichier" !!! Et tu me diras "dans le dossier c:\truc\chose".
Bon ben pour Python c'est pareil. Tu lui dis "ouvre le fichier VIRM8.pdf" il te répond "je ne sais pas où il est" parce que Python c'est un truc bête qui ne cherche pas plus loin que ce qu'on lui dit et si on ne le lui dit pas, il fait pas. Et ce n'est pas parce que deux lignes plus haut tu lui as dit "liste-moi le contenu du dossier c:\truc\chose" qu'il va faire le rapprochement intelligent de "ah oui, peut-être que VIRM8.pdf se trouve dans le dossier c:\truc\chose que je viens de lire à l'instant". Parce que Python, c'est un truc bête: c'est un simple analyseur d'instructions. A toi de lui donner les bonnes instructions.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
J'ai parfaitement compris ce que tu m'as dit plus haut.
Je repondais juste a une de tes attaques, en te précisant que j'avais fait la verification.
Maintenant je suis en train de regarder par rapport a ton commentaire qui lui, est intéressant :
Parce que l'instruction os.listdir("c:\X") te donne des noms relatifs au dossier "c:\X" (le nom du dossier n'est pas mis dans le nom renvoyé). Or si ce dossier "c:\X" contient un fichier "VIRM8.pdf", le fichier se nomme en réalité "c:\X\VIRM8.pdf" et non pas "VIRM8.pdf". Mais la variable filename et que tu ouvres via fitz.open(filename) ne contient que "VIRM8.pdf". Si par chance tu te trouves déjà dans "c:\X" quand tu lances le programme ça marchera quand-même (le nom relatif correspond) mais quand tu passes par un exécutable, tu n'es certainement pas à l'endroit où se trouve le fichier.
Ce n'est pas mentionné dans le post auquel j'ai répondu. Ni non plus dans ton dernier code source posté ici. Or je ne peux baser mes réponses que sur les informations que tu donnes et/ou sur le code que je vois ; pas sur les informations que tu ne donnes pas ou sur le code qui a été mais qui n'est plus.
Accessoirement, tu as donc fait la vérification et nulle part tu ne t'es dit, suite à cette vérification, "c'est bizarre, il m'affiche VIRM8.pdf mais il devrait m'afficher aussi le dossier dans lequel il se trouve sinon comment peut-il le retrouver ensuite?"
Vérifier c'est regarder puis réfléchir sur "est-ce que ce que je vois correspond à ce que je dois voir"...
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Je mets ci-dessous la solution qui est surtout destinée pour les utilisateurs qui ont appris Python depuis peu, (2 mois en ce qui me concerne) car ça aidera peut-être.
Pour me référer au message de tyrtamos (Merci à toi) :
L'information stockée dans la variable "Filename" est différente selon la façon dont on lance le programme.C'est normal. Auto-py-to-exe est une version graphique de pyinstaller. Ce programme ne fait pas une compilation native comme le C peut en faire, mais plutôt une "encapsulation" du code Python, des modules qu'il utilise et de l'interpréteur Python lui-même. Lorsqu'on lance l'exe, il se "déarchive" dans un répertoire temporaire et s'exécute dans celui-ci. La conséquence, c'est que les adresses d'accès à des fichiers non-python doivent souvent être recalculées.
Par la console, le chemin du répertoire temporaire est conservée donc transparente pour l'utilisateur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #Boucle pour appliquer le code sur tous les fichiers du repertoire for filename in os.listdir(cheminFacturesMasse+"//"): if filename.endswith('.pdf'): doc = fitz.open(filename)
Mais si on l'utilise par un .exe, alors il ne reste plus que le nom (et non pas le chemin complet ).
C'est pourquoi il faut le rajouter :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #Boucle pour appliquer le code sur tous les fichiers du repertoire for filename in os.listdir(cheminFacturesMasse+"//"): if filename.endswith('.pdf'): doc = fitz.open(chemin + "//" + filename)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager