Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Python] Remplacer une chaine de caractère par une autre

Je ne dois pas utiliser la bonne fonction...

Sujet résolu
16 avril 2010 à 20:00:14

Bonsoir chers zér0s ^^

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 ? :euh:
Merci d'avance, darkrojo.

  • Partager sur Facebook
  • Partager sur Twitter
16 avril 2010 à 20:06:15

Bonsoir,

>>> 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)
  • Partager sur Facebook
  • Partager sur Twitter
16 avril 2010 à 20:11:29

Citation : Grinwik


>>> 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 ?
  • Partager sur Facebook
  • Partager sur Twitter
16 avril 2010 à 20:19:12

Citation : darkrojo

En quoi tu me donne une fonction qui remplace plusieurs caractères par d'autres ?


Tu l'as déjà.
>>> "je regarde attentivement *** indications qu'on me donne".replace('***','les')
"je regardes attentivement les indications qu'on me donne"


C'est juste que les chaines ne sont pas modifiables, donc appliquer une méthode sur une chaine ne la modifie pas mais en renvoie une autre.
  • Partager sur Facebook
  • Partager sur Twitter
16 avril 2010 à 20:23:03

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


Cordialement, darkrojo.
  • Partager sur Facebook
  • Partager sur Twitter
16 avril 2010 à 20:38:07

Pour quelque chose un peu plus dans l'esprit "one shot" :

# -*- coding: utf-8 -*-
import sys

for nom in sys.argv[1:]:
    open(nom+'~','w').write(
        open(nom).read().replace('    ','\t')
        )


Avec CPython tu n'as pas besoin de fermer les fichiers, le ramasse miette le fera immédiatement. Après je ne connais pas les autres implémentations.

ps: sur le SDZ c'est plus beau avec des espaces :p
  • Partager sur Facebook
  • Partager sur Twitter
16 avril 2010 à 20:39:46

En effet, ta méthode est plus minimaliste, mais bon je pouvais pas savoir je débute là dedans :p
  • Partager sur Facebook
  • Partager sur Twitter
16 avril 2010 à 23:26:15

Bonsoir,

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

Exemple :
[mathias@Marvin ~]$ cat test.c
aga;
    youhou;
agapoum    poum;
[mathias@Marvin ~]$ sed -e s/"    "/"\t"/g test.c 
aga;
        youhou;
agapoum poum;


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.


Bonne soirée,
Cordialement,
  • Partager sur Facebook
  • Partager sur Twitter
19 janvier 2018 à 20:07:25

Bonsoir,

Moi, je voudrais supprimer tous les signes de ponctuations d'un texte, mais je n'ai pas trouvé la solution.

Merci d'avance.

  • Partager sur Facebook
  • Partager sur Twitter
20 janvier 2018 à 10:36:48

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

Déterrage

Citation des 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 pouce en haut pour dire merci. Si le topic date de plus de deux mois sans réponses, mieux vaut ne pas répondre.

Je ferme ce topic.

  • Partager sur Facebook
  • Partager sur Twitter

Moderateur forum || FAQ 3D || discord 3D francophone || OC Tweak script