Résolu Comment supprime-t-on une section dans un fichier - batch ?

Solutions (6)
Tags :
  • Désinstaller
  • Batch
  • Programmation
|
Bonjour,
Voilà mon problème est simple, je souhaite ajouter une section complète dans un fichier "scenery.cfg", et j'ai trouver la solution ici, le seul problème c'est que j'aimerais aussi à l'aide d'un fichier ".bat", cette fois-ci désinstaller la section en question, voici comment la structure se présente :

[Area.XX]
Title=nomdelascene ==> Information 1
Local=Scenery\dossierdelascene ==> Information 2
Layer=XX
Active=TRUE
Required=FALSE

Sachant que XX, je souhaiterait donc supprimer la section à partir de l'information 1 et 2, supprimer toute la section c'est à dire de "[Area.XX]" à "Required=FALSE", sans me soucier de la valeur de XX. En gros, je doit juste dans le fichier ".bat" donner l'information 1 et 2, et le fichier ".bat" comprend qu'il doit supprimer cette section de son début à sa fin, mais sans toucher aux autres sections de ce fichier "scenery.cfg". Mais le plus gros problème c'est que je ne voit pas comment ont pourrait sélectionner le texte avec des délimiteurs puisqu'ils n'y en a pas ! Si il y a une alternative au fichier .bat, je suis preneur, par contre je ne m'y connait pas.

PS : C'est vraiment important, et un projet entier est bloqué à cause de ça.

Merci d'avance de votre aide !

Cordialement
Pilotepro
  • Meuniers a édité ce message
Contenus similaires
Meilleure solution
partage
|
Je t'ai donné la commande DOS. Pour la mettre dans un script .bat, il faut doubler les %: ... %%A in ... echo %%A === %%B.

Ensuite pour le vocabulaire, dans un fichier de type .ini/.cfg, [Area.XX] est une section, et tout ce qui est à l'intérieur est dans la section. Chaque élément dans la section est une option.

Enfin, en python:
  1. import os
  2.  
  3. #Chargement du module pour traiter les fichier cfg
  4. import configparser
  5.  
  6. #Creation de l'objet config représentant tout le fichier
  7. config = configparser.RawConfigParser()
  8.  
  9. #Ouverture et décodage du fichier
  10. config.read(r'c:\example.cfg')
  11.  
  12. #Boucle sur toute les sections:
  13. for section in config.sections():
  14.  
  15. print('traitement section :',section)
  16.  
  17. # Récupération de l'option à tester
  18. titre = config.get(section, 'Title')
  19.  
  20. # Test si le titre est celui recherché
  21. if titre == 'nomdelascene':
  22.  
  23. print('Suppression de la section :', section)
  24.  
  25. # Suppression de la section dans la config
  26. config.remove_section(section)
  27.  
  28. # Enregistrement de la config dans un fichier
  29. with open(r'c:\résultat.cfg', 'wb') as fichierConfig:
  30. config.write(fichierConfig)
  31.  
  32. os.system('pause')

Voilà, c'est quand même plus simple non ? :) 

Infos récupérées ici: http://docs.python.org/library/configparser.html

PS: code non testé, mais devrait fonctionner (en l'adaptant pour ton cas)
PPS: en python les bloc sont définis par l'indentation (espaces en début de ligne), donc faire attention.
PPPS: il faut installer python, et metrte ce script dans un fichier .py
  • Commenter cette solution |
Score
0
òh
òi
|
J'ai testé et regardé les sources du configparser, et effectivement, les majuscules sont perdues.

Donc, comme je t'ai donné une mauvaise direction, je te donne le script qui fait ce que tu souhaites:
  1. """
  2. Fonction indiquant si une ligne est un début de section
  3. Paramètre : ligne : la ligne texte à tester
  4. Retourne True si la ligne est un début de section, False sinon
  5. """
  6. def isDebutSection(ligne):
  7. if len(ligne) > 0 and ligne[0] == '[' and ligne[-1] == ']':
  8. return True
  9.  
  10. """
  11. Fonction indiquant si c'est la section recherchée
  12. Paramètre : lignesRestantes : tableau des lignes restantes dans tout le fichier
  13. nomOption : nom de l'option à rechercher
  14. valeurOption : valeur à rechercher
  15. Retourne True si la section est celle recherchée, False sinon
  16. """
  17. def isDetectedSection(lignesRestantes, nomOption, valeurOption):
  18. # boucle sur les lignes restantes
  19. for ligne in lignesRestantes:
  20.  
  21. if isDebutSection(ligne):
  22. # On tombe sur une nouvelle section => pas trouvé
  23. return False
  24. else:
  25. if ligne.find(nomOption) >= 0 and ligne.find(valeurOption) >= 0:
  26. # trouvé
  27. return True
  28.  
  29. # tout le fichier a été scanné => rien trouvé
  30. return False
  31.  
  32. """
  33. Fonction supprimant les section recherchée
  34. Paramètre : listeLignes : liste de toutes les lignes du fichier
  35. Retourne la copie de la liste de toutes les lignes du fichier sans les sections
  36. """
  37. def modifierConfig(listeLignes):
  38. copierSection = True
  39. resultat = []
  40.  
  41. # Boucle sur les lignes
  42. for i in range(len(listeLignes)):
  43.  
  44. if isDebutSection(listeLignes[i]):
  45.  
  46. # Ligne de section : tester s'il faut la copier ou non
  47.  
  48. if isDetectedSection(listeLignes[i+1:], 'Title', 'nomdelascene'):
  49. copierSection = False
  50. else:
  51. resultat.append(listeLignes[i])
  52. copierSection = True
  53. else:
  54.  
  55. # A l'intérieur d'une section, on copie s'il faut garder la section
  56. if copierSection:
  57. resultat.append(listeLignes[i])
  58.  
  59. return resultat
  60.  
  61. #----------------------
  62. # Exécution principale
  63.  
  64. # Chargement
  65. fichier = open(r'C:\source.cfg', 'r')
  66. contenu = fichier.read()
  67. fichier.close()
  68. listeLignes = contenu.split('\n')
  69.  
  70. # Modification
  71. nouvelleListeLignes = modifierConfig(listeLignes)
  72.  
  73. # Enregistrement
  74. contenu = '\n'.join(nouvelleListeLignes)
  75. fichier = open(r'C:\resultat.cfg', 'w')
  76. fichier.write(contenu)
  77. fichier.close()

J'ai testé, ça fonctionne. Adapte-le à ce que tu veux faire.
Pour la recherche de l'option, je me suis contenté de ça: if ligne.find(nomOption) >= 0 and ligne.find(valeurOption) >= 0:
ça peut être amélioré en détectant le = et supprimant les espaces avec trim(), mais bon, est-ce utile ? :) 

Citation :
D'autre part, pour que le script marche je suis obligé de faire clique droit dessus>Edit with IDLE

Non, en double-cliquant du le fichier .py, ça suffit. Par contre, tu ne verra rien parce que l'exécution est rapide. ;) 

Citation :
Et enfin une dernière chose, sachant que japperait ce script à partir de la fin d'une installation, est il nécessaire que l'utilisateur dispose de python installé pour l'utilisé ? N'y a t'il pas moyen de convertir ce fichier ".py" en un fichier indépendant, qui n'aura pas besoin du programme python, ou encore de le convertir en batch ou exe (j'ai essayé py2exe mais il me sort des erreurs).

Oui, sous windows, c'est l'inconvénient, il faut installer la console.

Quelles sont tes erreurs de py2exe ?
  • Commenter cette réponse |
Score
0
òh
òi
|
Bonsoir,
Merci énormément de votre aide, vous nous avez sauvé mon équipe et moi !
Il y a juste un problème et pas des moindres, le script que vous m'avez proposé fonctionne très bien, le seul soucis c'est qu'il change toutes les majuscules présentes en début de fichier, et les remplaces toutes par des minuscules, ce qui pose vraiment un problème, donc si vous pouviez m'aidé à régler ce détail je vous en serait encore plus reconnaissant ! D'autre part, pour que le script marche je suis obligé de faire clique droit dessus>Edit with IDLE et enfin d'appuyer sur F5 dans le programme d'édition, or je souhaiterait que le script s’exécute et fonctionne dès que je le lance avec un double clique, j'ai essayer de le renommé en ".pyw" (il est actuellement en ".py") mais sans résultats. Et enfin une dernière chose, sachant que japperait ce script à partir de la fin d'une installation, est il nécessaire que l'utilisateur dispose de python installé pour l'utilisé ? N'y a t'il pas moyen de convertir ce fichier ".py" en un fichier indépendant, qui n'aura pas besoin du programme python, ou encore de le convertir en batch ou exe (j'ai essayé py2exe mais il me sort des erreurs).

Merci d'avance de votre aide !

Cordialement
Pilotepro
  • Commenter cette réponse |
Score
0
òh
òi
|
Meilleure réponse sélectionnée par pilotepro.
  • Commenter cette réponse |
Score
0
òh
òi
|
Bonsoir,
Pour commencé, je te remercie pour ta réponse, alors en ce qui concerne ce que tu me propose, elle est génial mais le problème c'est qu'étant débutant je ne sais pas comment faire :

- recherche une section dans le fichier
- pouvoir traiter toutes les lignes de la section
- reprendre le fichier pour supprimer la section trouvée

Or, ce sont les trois étapes indispensables, si en python c'est aussi simple pourrait tu me donné le code s'il te plait le code réalisant ma demande, car c'est vraiment urgent et avec mon équipe nous sommes bloqués pour tout le reste à cause de ça. Mais, si tu n'a pas envie (et c'est ton droit), peut tu me donné des liens vers des tutoriels expliquant comment réaliser ceci, ou me l'expliqué directement. De plus, dans le code que tu me propose, il y a un problème majeur, c'est qu'il utilise le "=" comme délimiteurs or comme je le disait plus haut, le fichier en question est composé de plusieurs section qui vont de "Area.XX" à "Required=False", donc si j'utilise la commande que tu me décrit, il va supprimer toutes les sections du fichiers.

Merci d'avance de ton aide !

PS : J'ai lancé FOR /F "tokens=1* delims==" %A in ('type tonfichier.txt') do @echo %A === %B et je tombe sur l'erreur "A était inattendue" dans cmd, pourquoi ?

Cordialement
Pilotepro
  • Commenter cette réponse |
Score
0
òh
òi
|
Déjà en python, ça se fait en 2 minutes, mais passons. :) 

Tu dois utiliser le FOR /F avec l'option delims prenant le caractère =
  1. FOR /F "tokens=1* delims==" %A in ('type tonfichier.txt') do @echo %A === %B


Ensuite la recherche de la section est plus complexe, car il te faut:
- recherche une section dans le fichier
- pouvoir traiter toutes les lignes de la section
- reprendre le fichier pour supprimer la section trouvée

En fait, plutôt que de supprimer, il faut créer un autre fichier ou tu ne copie que ce que tu veux garder.

Bref, comme je le disais, en python, il suffit de charger la classe de configuration pour .ini, parcourir les sections, trouver la sections simplement, et supprimer la section simplement.
  • Commenter cette réponse |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS