Je viens de réaliser un script en Python pour nettoyer le code source d'un de mes programme méchamment salit par QtCreator qui s'obstine à m'insérer 4 espaces au lieu d'une tabulation pour l'indentation de mon code source.
Voici le script en lui même ( réalisé avec le tuto de Swinnen à coté, ça faisait longtemps que je n'avais pas touché au Python )
# -*- coding: utf-8 -*-
import sys
for index in range(len(sys.argv)): # On parcours la liste des arguments
if index != 0: # On ingnore le nom du script fourni en paramètre 0
fichier = open(sys.argv[index],'r')
fichier2 = open(sys.argv[index]+'~','w') # On rajoute un tilde à la fin pour éviter d'écraser le fichier source en cas de bug
lignes = fichier.readlines() # On parcours les lignes du fichier source
for ligne in lignes:
ligne.replace(' ','\t') # On remplace tout les espaces par groupe de 4 en tabulation
fichier2.write(ligne) # On écrit la nouvelle ligne dans le nouveau fichier
fichier.close() # Fermeture du fichier source
fichier2.close() # Fermeture du fichier écrit
Le problème, c'est que l'appel à ligne.replace(' ','\t') ne fait rien et le fichier final est le même que celui original.
En effet, d'après Swinnen, cette fonction remplace les caractères et non pas les chaines de caractère. J'ai essayé pour voir si cela marchait, mais apparemment non .
Connaitriez-vous une fonction qui pourrais correspondre à mes besoins ?
Merci d'avance, darkrojo.
>>> s = "zero"
>>> s
'zero'
>>> s.replace('e','o')
'zoro'
>>> s
'zero'
>>> s = s.replace('e','o')
>>> s
'zoro'
=)
Sinon les espaces, c'est le bien.
Pour le coup un script bash serait surement plus rapide (à écrire).
(sauf en faisant du python qui ressemble vraiment à du python =P)
>>> s = "zero"
>>> s
'zero'
>>> s.replace('e','o')
'zoro'
>>> s
'zero'
>>> s = s.replace('e','o')
>>> s
'zoro'
En quoi tu me donne une fonction qui remplace plusieurs caractères par d'autres ?
Citation
Sinon les espaces, c'est le bien.
Chacun ses goûts, mais moi ça m'énerve, on a créé les tabulations spécialement pour cette usage
Citation
Pour le coup un script bash serait surement plus rapide (à écrire).
Perso, j'y ai pas touché depuis un petit bout de temps non plus et je m'en sert plus pour renommer des fichiers en masse que pour modifier les fichiers en eux-même...
Allez, il doit bien y avoir une fonction pour ça, non ?
Merci beaucoup de ta réponse Grinwik !
Voici le code final pour ceux que ça intéresse :
# -*- coding: utf-8 -*-
import sys
for index in range(len(sys.argv)): # On parcours la liste des arguments
if index != 0: # On ingnore le nom du script fourni en paramètre 0
fichier = open(sys.argv[index],'r')
fichier2 = open(sys.argv[index]+'~','w') # On rajoute un tilde à la fin pour éviter d'écraser le fichier source en cas de bug
lignes = fichier.readlines() # On parcours les lignes du fichier source
for ligne in lignes:
ligneFinale = ligne.replace(' ','\t') # On remplace tout les espaces par groupe de 4 en tabulation
fichier2.write(ligneFinale) # On écrit la nouvelle ligne dans le nouveau fichier
fichier.close() # Fermeture du fichier source
fichier2.close() # Fermeture du fichier écrit
Bien que l'on puisse faire ce genre de choses avec Python, une solution plus simple et plus rapide dans ce genre de situation serait d'utiliser sed (« éditeur de texte » barbare - en fait éditeur de flux d'Unix).
Dans ce cas on cherche à remplacer toutes les occurrences de la chaîne " " (4 × espace) par "\t".
Ce qui donne l'expression régulière suivante : s/" "/"\t"/g
(le /g final signifie « toutes les occurrences », on ne s'arrête pas au premier match)
Et donc en un coup de sed : $ sed -e s/" "/"\t"/g FichierÀRéparer
Sed écrit son résultat sur la sortie standard.
Penser à rediriger celle-ci vers un nouveau fichier (distinct du fichier d'origine !) pour conserver le résultat de la commande sed.
Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention plus facilement. Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé. Pour plus d'informations, nous vous invitons à lire les règles générales du forum
Avant de poster, demandez-vous si ce que vous allez dire apporte quelque chose au sujet. Si votre message n'apporte rien, vous ferez perdre du temps à tout le monde et le sujet pourrait dévier ou devenir difficile à suivre.
Aussi, vérifiez la date du topic. Le déterrage de topic nuit au bon fonctionnement du forum et est interdit. Utilisez les boutons pour dire merci. Si le topic date de plus de deux mois sans réponses, mieux vaut ne pas répondre.
Moderateur forum || FAQ 3D || discord 3D francophone || OC Tweak script