Débutant à Python .... demandé de l'aide à la tâche suivante :-)Python - RegExp - Modifier les fichiers texte
Je arbre de divers dossiers, certains d'entre eux sont le code source C. Je voudrais modifier ces fichiers C avec un script python.
Le code C a 4 - définit
#define ZR_LOG0(Id, Class, Seveity, Format)
#define ZR_LOG1(Id, Class, Seveity, Format, Attr0)
#define ZR_LOG2(Id, Class, Seveity, Format, Attr0, Attr1)
#define ZR_LOG3(Id, Class, Seveity, Format, Attr0, Attr1, Attr2)
Il existe différentes lignes ZR_LOGn répartis dans tout le code source C.
Exemple: ZR_LOG1 (1, LOG_CLASS_3, LOG_INFO, "hello world% d", 76);
Des espaces blancs (espaces, tabulations) peuvent apparaître n'importe où sur la ligne (entre les champs).
La tâche de script Python est comme suit:
- Remplacer tout champ « id » (qui est un type entier que nous ne se soucient pas de sa valeur d'origine) avec compteur séquentiel. (La première ligne 'LOG' ... nous rencontrerons le champ 'Id' obtiendra la valeur 0, la suivante 1, et ainsi de suite)
Dans un fichier de sortie séparé, pour chaque ligne ZR_LOG, nous « ll créer une ligne d'index dans le format {newID, Format}, Pour l'exemple ci-dessus obtiendrez:
{ 0, "hello world %d" },
apprécie votre aide avec elle ....
J'ai commencé avec le code suivant, vous pouvez le regarder ou l'ignorer complètement.
'''
Created on Oct 25, 2009
@author: Uri Shkolnik
The following version does find & replace LOG Ids for all
C source files in a dir (and below) with sequential counter,
The files are assumed to be UTF-8 encoded.
(which works fine if they are ASCII, because ASCII is a
subset of UTF-8)
It also assemble new index file, composed from all new IDs and format fields
'''
import os, sys, re, shutil
mydir= '/home/uri/proj1'
searched_pattern0 = 'ZR_LOG0'
def search_and_replace(filepath):
''' replaces all string by a regex substitution '''
backupName=filepath+'~re~'
print 'reading:', filepath
input = open(filepath,'rb')
s=unicode(input.read(),'utf-8')
input.close()
m = re.match(ur'''[:space:]ZR_LOG[0-3].*\(.*[0-9]{0,10},LOG_''', s)
print m
def c_files_search(dummy, dirr, filess):
''' search directories for file pattern *.c '''
for child in filess:
if '.c' == os.path.splitext(child)[1] and os.path.isfile(dirr+'/'+child):
filepath = dirr+'/'+child
search_and_replace(filepath)
os.path.walk(mydir, c_files_search, 3)
merci :-) a été très utile – Uri