Les substitutions communes entre différents fichiers
masal
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
J'ai un programme qui modifie automatiquement des champs déjà définis dans plusieurs template
Par exemple, dans mon modèle, j'ai défini un champ
Parfois les substitutions sont communes entre les différents fichiers, il est donc inutile de les demander plusieurs fois. comment puis-je résoudre ce problème ?
J'ai un programme qui modifie automatiquement des champs déjà définis dans plusieurs template
.text.
Par exemple, dans mon modèle, j'ai défini un champ
def\clients{#.......#} le code demande avec quoi je veux le remplacer .
Parfois les substitutions sont communes entre les différents fichiers, il est donc inutile de les demander plusieurs fois. comment puis-je résoudre ce problème ?
import os, subprocess, re
def find_occurrences(template_tex):
# Open template.tex
with open(template_tex, "r") as f:
filedata = f.read()
# Find occurrences of {{item}}
return set(re.findall("\#(.*?)\#", filedata))
def prompt_replacements(occurrences):
replacements = dict()
# Replacing fields
for occurrence in occurrences:
replaceby = input("Replace " + occurrence + " by: " )
replacements[occurrence] = replaceby
return replacements
def clean_latex_temporary_files(result_tex):
filename_wext = result_tex[:result_tex.rfind(".")]
for ext in ["tex", "aux", "log"]:
print("rm", filename_wext + "." + ext)
os.remove(filename_wext + "." + ext)
def compile_latex(result_tex):
# Convert result.tex to result.pdf
proc = subprocess.Popen(["pdflatex", "-interaction=nonstopmode", result_tex])
proc.communicate()
clean_temporary_files(result_tex)
def make_replaced_latex(template_tex, result_tex, replacements):
# Write results
with open(template_tex, "r") as f:
filedata = f.read()
for (occurrence, replaceby) in replacements.items():
filedata = filedata.replace("{{" + occurrence + "}}", replaceby)
with open(result_tex, "w") as f:
f.write(filedata)
def main():
map_template_result = {
"template1.tex" : "result1.tex",
"template2.tex" : "result2.tex",
"template3.tex" : "result3.tex",
}
occurrences = set()
for template_tex in map_template_result.keys():
occurrences |= find_occurrences(template_tex)
replacements = prompt_replacements(occurrences)
for (template_tex, result_tex) in map_template_result.items():
make_replaced_latex(template_tex, result_tex, replacements)
compile_latex(result_tex)
clean_temporary_files(result_tex)
main()
3 réponses
-
Bonjour
Tous d'abord, tu as essayé d'utiliser la coloration syntaxique mais sans forcer le langage python, ce qui a donné un pavé gris, moche, sans coloration, numérotation de ligne et ascenseurs.
J'ai corrigé ton message mais pour la prochaine fois merci de prendre en compte ce petit tuto.
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Pour répondre à ta question, sans avoir décortiqué ton code.
Si tu veux faire un template à la fois pour plusieurs fichiers, il suffit de demander le template et une liste de fichiers.
Si tu veux faire plusieurs template valables sur plusieurs fichiers, il de demander la liste des templates et la liste des fichiers.
Là où ça se complique c'est si tu veux remplacerdef\clients{#.......#}
partoto
dans 4 fichiers puis partutu
dans 5 fichiers et partiti
pour ceux qui restent.
-
mais parfois dans les fichiers il y a des champs identique dons je peux pas qu'ile me demande de les remplir à chaque fois
Je suis pas certain de comprendre cette phrase.
Dans mon interpretation, ça revient à ce que je t'ai déjà ditSi tu veux faire un template à la fois pour plusieurs fichiers, il suffit de demander le template et une liste de fichiers.
-
je suis désolé : je voulais dire que je veux pas qu'a chaque fois me demande de remplir le champs .
par exemple dans lefichier1.tex
il y a\def\date {......}
dans un autres fichierfichier2.tex
il y a le même champs\def\date {......}qui doit être remplis par la même chose que pour le premier fichier
-
-
Oui, ma réponse reste la même.
Tu demandes le "code" à trouver, la valeur de remplacement et la liste des fichiers.
Ensuite tu ouvres chacun des fichiers et tu y appliques le changement.