Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 17/01/2016, à 06:53

pingouinux

Re : Reconstruire des liens manquants (python?)

roger64 a écrit :

L'erreur était causée par une parenthèse mal placée .

C'est exact, et je viens de corriger les scripts en #13 et #17. Désolé pour cette erreur… sad

Hors ligne

#27 Le 25/02/2016, à 10:18

roger64

Re : Reconstruire des liens manquants (python?)

Bonjour

Le script poursuit sa vie laborieuse. Je viens de rencontrer un petit problème:

Mes fichiers .xhtml étaient numérotés de la façon suivante: chapter01, chapter02, chapter03, ..., chapter10, chapter11,etc.
Le script a négligé les fichiers qui commençaient par un zéro après le mot chapter et n'a commencé à travailler qu'à partir de chapter10.

Ce cas de figure risque de se reproduire. Y a-t-il mieux à faire que renommer les fichiers?

Hors ligne

#28 Le 25/02/2016, à 10:27

pingouinux

Re : Reconstruire des liens manquants (python?)

Bonjour roger64,
Je vais regarder dans la journée, mais il faut que je me remémore le problème.

Hors ligne

#29 Le 25/02/2016, à 11:35

pingouinux

Re : Reconstruire des liens manquants (python?)

Bon ! Tu peux tester ce script légèrement modifié pour voir s'il convient.
Normalement, il accepte les formes de numérotation chapter1, chapter01, chapter001, ...
Si deux chapitres conduisent au même entier, le script devrait s'arrêter avec un message d'erreur.

#!/usr/bin/python3

import re, os, sys, glob

pref,suff='chapter','.xhtml'

id_fichier={}
nu_fichier={}
id_nu={}
# Recherche du fichier de numéro le plus élevé
fichiers=glob.glob('%s*[0-9]%s'%(pref,suff))
def id_nu_fichier(fic):
   k=re.search('%s(\d+)%s'%(pref,suff),fic)
   if k:
      id=k.group(1)
      nu=int(id)
      if nu in id_nu :
         sys.stderr.write("\nIl existe les numéros %s et %s\n\n"%(id_nu[nu],id))
         exit(1)
      id_fichier[fic]=id
      nu_fichier[fic]=nu
      id_nu[nu]=id
for fic in fichiers: id_nu_fichier(fic)
fichiers.sort(key=lambda x:nu_fichier[x])
der=nu_fichier[fichiers[-1]]
print("der=%d"%(der))

# On vérifie que le fichier de sortie n'existe pas déjà
out='%s%smodif%s'%(pref,der,suff)
if os.path.lexists(out):
   sys.stderr.write("\nAttention : le fichier %s existe déjà\n\n"%out)
   exit(1)

# Recherche de : href="fichier#ftnx" id="bodyftnx"
rec_lien=re.compile('(href="%s(?P<fil>\d+)%s#ftn(?P<id>\d+)"\s+id="bodyftn(?P=id)")'%(pref,suff))
# Recherche de : href="dernier_fichier#ftnx" id="bodyftnx"
rec_lien99=re.compile('(href="%s%s%s#ftn(?P<id>\d+)"\s+id="bodyftn(?P=id)")'%(pref,der,suff))
# Recherche de : href="dernier_fichier#bodyftnx" id="ftnx"
lien99='(href="%s)%s(%s#bodyftn%%s"\s+id="ftn%%s")'%(pref,der,suff)

# Liste des liens dans tous les fichiers sauf le dernier
liste_liens=[]
for num_fic in range(1,der):
   try:
      with open('%s%s%s'%(pref,id_nu[num_fic],suff),'r') as fic: liens=rec_lien.findall(fic.read())
   except (FileNotFoundError,KeyError): continue
   for lien in liens:
      num_fil=lien[1]
      num_id=lien[2]
      if num_fil=='%s'%der: liste_liens.append((num_fic,num_fil,num_id,lien[0]))

# fichier[id] : numéro du fichier qui contient le lien de numéro id
fichier={}
for num_fic,num_fil,num_id,lien in liste_liens:
 # print("%s%-2s%s %2s %2s => %s"%(pref,num_fic,suff,num_fil,num_id,lien))
   fichier[num_id]=str(num_fic)
# Modification des liens du dernier fichier
with open('%s%s%s'%(pref,der,suff),'r') as fic: f99=fic.read()
f99bis=f99
for id in fichier:
   k=re.search(lien99%(id,id),f99bis)
   if k:
      f99bis=f99bis[:k.start(0)]+k.group(1)+fichier[id]+k.group(2)+f99bis[k.end(0):]

# Écriture du résultat
with open(out,'w') as fic: fic.write(f99bis)

Ajouté : Je n'ai pas touché aux numéros des liens dans les fichiers, en supposant qu'il s'agit toujours d'entiers ne commençant pas par zéro.

Dernière modification par pingouinux (Le 25/02/2016, à 12:47)

Hors ligne

#30 Le 25/02/2016, à 15:01

roger64

Re : Reconstruire des liens manquants (python?)

Merci de ta réponse éclair. Je teste zillico.

Hors ligne

#31 Le 25/02/2016, à 15:45

roger64

Re : Reconstruire des liens manquants (python?)

@pingouinux

Impeccable! Cela fonctionne sans problème avec les 01, 02, etc. Les autres fichiers ne devraient pas changer de dénomination.

Merci beaucoup de ton aide rapide et efficace. smile

Hors ligne

#32 Le 01/03/2016, à 16:08

roger64

Re : Reconstruire des liens manquants (python?)

Bonjour

Je me suis emballé un peu vite parce que je viens de faire un maxi-essai et ça passe... presque. roll

Maintenant le script traite effectivement les fichiers qui ont une adresse href du genre chapter05.xhtml. Mais lorsqu'il remplit les nouveaux liens, donc lorsqu'il écrit les adresses à l'intérieur des fichiers, il les écrit de la façon suivante: chapter5.xhtml, en oubliant le zéro, ce qui bien sûr génère une erreur lorsqu'on importe le fichier. Cette erreur est d'ailleurs facilement corrigeable avec une expression régulière mais gênante.

Je viens de faire un test sur 1078 liens, dont 124 contenus dans des chapters allant de 01 à 09 et cette erreur se répète. Désires-tu des fichiers de test ou mes explications te suffisent-elles?

avec toutes mes excuses pour mon malheureux test précédent.

Dernière modification par roger64 (Le 01/03/2016, à 16:09)

Hors ligne

#33 Le 01/03/2016, à 16:50

pingouinux

Re : Reconstruire des liens manquants (python?)

Regarde ce que j'avais ajouté à la fin de mon message #29 : j'attendais de savoir ce qu'il fallait faire avant de me lancer.
Je vais regarder.

ajouté :
Je veux bien 2 fichiers de test : un intermédiaire + le dernier

Dernière modification par pingouinux (Le 01/03/2016, à 17:26)

Hors ligne

#34 Le 02/03/2016, à 01:58

roger64

Re : Reconstruire des liens manquants (python?)

Merci de ton aide.

C'est exact. Je n'ai eu le vrai fichier de test que récemment et je n'avais testé que de façon incomplète.

Fichiers de test envoyés.

Hors ligne

#35 Le 02/03/2016, à 09:32

pingouinux

Re : Reconstruire des liens manquants (python?)

À force de coller des rustines, je ne m'y retrouve plus moi-même; le parfait exemple de ce qu'il ne faut pas faire…
Tu peux essayer ceci

#!/usr/bin/python3

import re, os, sys, glob

pref,suff='../Text/chapter','.html'

id_fichier={}
nu_fichier={}
id_nu={}
# Recherche du fichier de numéro le plus élevé
fichiers=glob.glob('%s*[0-9]%s'%(pref,suff))
def id_nu_fichier(fic):
   k=re.search('%s(\d+)%s'%(pref,suff),fic)
   if k:
      id=k.group(1)
      nu=int(id)
      if nu in id_nu :
         sys.stderr.write("\nIl existe les numéros %s et %s\n\n"%(id_nu[nu],id))
         exit(1)
      id_fichier[fic]=id
      nu_fichier[fic]=nu
      id_nu[nu]=id
for fic in fichiers: id_nu_fichier(fic)
fichiers.sort(key=lambda x:nu_fichier[x])
der=id_fichier[fichiers[-1]]
print("der=%s"%(der))

# On vérifie que le fichier de sortie n'existe pas déjà
out='%s%smodif%s'%(pref,der,suff)
if os.path.lexists(out):
   sys.stderr.write("\nAttention : le fichier %s existe déjà\n\n"%out)
   exit(1)

# Recherche de : href="fichier#ftnx" id="bodyftnx"
rec_lien=re.compile('(href="%s(?P<fil>\d+)%s#ftn(?P<id>\d+)"\s+id="bodyftn(?P=id)")'%(pref,suff))
# Recherche de : href="dernier_fichier#ftnx" id="bodyftnx"
rec_lien99=re.compile('(href="%s%s%s#ftn(?P<id>\d+)"\s+id="bodyftn(?P=id)")'%(pref,der,suff))
# Recherche de : href="dernier_fichier#bodyftnx" id="ftnx"
lien99='(href="%s)%s(%s#bodyftn%%s"\s+id="ftn%%s")'%(pref,der,suff)

# Liste des liens dans tous les fichiers sauf le dernier
liste_liens=[]
for num_fic in range(1,int(der)):
   try:
      with open('%s%s%s'%(pref,id_nu[num_fic],suff),'r') as fic: liens=rec_lien.findall(fic.read())
   except (FileNotFoundError,KeyError): continue
   for lien in liens:
      num_fil=lien[1]
      num_id=lien[2]
      if id_nu[int(num_fil)]==der: liste_liens.append((num_fic,num_fil,num_id,lien[0]))

# fichier[id] : numéro du fichier qui contient le lien de numéro id
fichier={}
for num_fic,num_fil,num_id,lien in liste_liens:
   fichier[num_id]=id_nu[num_fic]

# Modification des liens du dernier fichier
with open('%s%s%s'%(pref,der,suff),'r') as fic: f99=fic.read()
f99bis=f99
for id in fichier:
   k=re.search(lien99%(id,id),f99bis)
   if k:
      f99bis=f99bis[:k.start(0)]+k.group(1)+fichier[id]+k.group(2)+f99bis[k.end(0):]

# Écriture du résultat
with open(out,'w') as fic: fic.write(f99bis)

Hors ligne

#36 Le 02/03/2016, à 11:09

roger64

Re : Reconstruire des liens manquants (python?)

Merci beaucoup de ton aide.

J'ai réussi sur le fichier test et cela ne génère plus aucune erreur. Les chapter05 sont bien identifiés et les liens sont bien marqués chapter05.

Avec mes excuses pour ce contretemps. sad

Dernière modification par roger64 (Le 02/03/2016, à 11:09)

Hors ligne