2017-09-15 1 views
0

Je souhaite créer un script de remplacement.Remplacer les séquences en Python

Il faut remplacer str1 par str2. Mon fichier a une structure basée sur xml. Par exemple, j'ai:

...word1'#13#10'word2'#13#10'word3... = ...word1'#13#10'word3... 

Je veux enlever une partie de la chaîne. Je l'utilise dans un script:

Lines[i] = Lines[i].replace(key, DataBase[key]) 

je l'ai déjà vérifié que "clé" et "DataBase [key]" sont définis correctement. Si je les imprime dans la console avec "print()" - cela ressemble à ce qu'il doit faire. Mais alors le script l'exécute ne change pas des séquences comme celle-ci - avec '# 13 # 10'. Des paires de clés sans aucun simbol spécifique fonctionnent bien. Que puis-je faire? Et pourquoi ça ne marche pas bien? script complet:

import configparser 
#import time 

config = configparser.ConfigParser() # init configparser 
config.optionxform = str 
config.read("SocratToCortesExpress.cfg") # config file 

print("Config file - readed") 

filePath = config.get("PATH", "old_file") # config file - with names of files, pairs of words 

DataStrings = config.items("DATA") # read pairs 
DataBase = dict() # initialization of dictionary 
print("Dictionary - initialized") 

for Dstr in DataStrings: # old and new words for a replacement 
    SocratName = Dstr[0] 
    CortesName = Dstr[1]  
    DataBase[SocratName] = CortesName 


print("Dictionary - fulfilled") 

with open(filePath, "r", encoding='utf-8-sig') as ResultFile: # input file Lines = ResultFile.readlines() 

print("Old file - uploaded") 

f1 = open('logkeys.txt', 'w') 
for key in DataBase.keys(): 
    try: 
     f1.write('\n'+key+'\n'+DataBase[key]+'\n') 
    except Exception as e: #errors 
      f2 = open('log.txt', 'w') 
      f2.write('An exceptional thing happed - %s' %e) 
      f2.close() 
f1.close() 


for i in range(len(Lines)): # brutforce - all over input file 
    #Lines[i] = Lines[i].replace('\ufeff', '') #some weird symbol 
    for key in DataBase.keys():  
     try: 
      Lines[i] = Lines[i].replace(key, DataBase[key]) #replacing 
     except Exception as e: #errors 
      f2 = open('log.txt', 'w')   
      f2.write('An exceptional thing happed - %s' %e) 
      f2.close() 


print("Sequences - replaced") 

outFileName = config.get("PATH", "new_file") # define output file 

print("Exit file - initialized") 

with open(outFileName, "a", encoding='utf-8-sig') as outFile: # save 
    for line in Lines:  
     outFile.write(line) 

print("OK") 
+1

Il se peut qu'il y ait un problème avec les parties du script que vous n'avez pas montrées; Je ne peux pas être sûr pour des raisons évidentes. –

+2

Veuillez ajouter votre code, afin que nous puissions vous aider. – Fejs

+0

En regardant ce que vous avez montré jusqu'à présent, il ne semble pas y avoir d'erreur. Le problème sera probablement dans les parties que vous n'avez pas montrées. Peut-être que si vous publiez plus de code, nous pourrions mieux vous aider. –

Répondre

2

Avez-vous essayé?

>>> s = "word1'#13#10'word2'#13#10'word3" 
>>> s.replace("'word2'#13#10'", '') 
"word1'#13#10word3" 
+0

Alors, j'ai essayé. Mais c'est un script, pas un shell. Et non, ça ne marche pas. Peut-être à cause de mon mot2 dans les caractères cyrilliques –

+0

Il n'a rien à voir s'il s'agit d'un script ou d'une exécution interactive. Pour le remplacement UTF-8, s'il vous plaît vérifier https://stackoverflow.com/questions/13093727/how-to-replace-unicode-characters-in-string-with-something-else-python –

+0

Merci beaucoup. Peut-être que je suis sur la bonne voie maintenant. J'utilise déjà l'encodage UTF-8: open (filePath, "r", encoding = 'utf-8-sig'). Cela m'aide à lire le fichier correctement, y compris la nomenclature. Mais encore, je ne peux pas remplacer ma chaîne qui comprend '# 13 # 10'. Je ne sais pas, peut-être y a-t-il le moyen de trouver et de remplacer des séquences en octets, pas en chaînes? D'abord encoder mes cordes, faire un remplacement et ensuite l'encoder en UTF-8 à nouveau. Mais je ne suis pas sûr si le remplacement en octets existe. –