2014-09-19 5 views
0

J'ai recommencé à coder en python, et je suis tombé sur un comportement étrange: j'ai deux chaînes qui sont exactement les mêmes (voir le code ci-dessous), mais l'une de ces chaînes est stockée dans un fichier, l'autre l'un est codé en dur. Maintenant, mon programme est en cours d'exécution, mais la chaîne du fichier est complètement différente dans la sortie par rapport à la chaîne codée en dur. Pourquoi?Python manipulation de chaînes

import sys 

message = '' 
message2 = 'MSH|^~\&|GHH LAB|ELAB-3|GHH OE|BLDG4|200202150930||ORU^R01|CNTRL-3456|P|2.4\r' 
message2 += 'PID|||555-44-4444||EVERYWOMAN^EVE^E^^^^L|JONES|196203520|F|||153 FERNWOOD DR.^^STATESVILLE^OH^35292||(206)3345232|(206)752-121||||AC555444444||67-A4335^OH^20030520\r' 
message2 += 'OBR|1|845439^GHH OE|1045813^GHH LAB|1554-5^GLUCOSE|||200202150730||||||||555-55-5555^PRIMARY^PATRICIA P^^^^MD^^LEVEL SEVEN HEALTHCARE, INC.|||||||||F||||||444-44-4444^HIPPOCRATES^HOWARD H^^^^MD\r' 
message2 += 'OBX|1|SN|1554-5^GLUCOSE^POST 12H CFST:MCNC:PT:SER/PLAS:QN||^182|mg/dl|70_105|H|||F' 
for line in sys.stdin: 
    message += line[:-1] 

print message 
print '\n\n' 
print "New message:\n\n" 
print message2 

Sortie:

MSH|^~\&|GHH LAB|ELAB-3|GHH OE|BLDG4|200202150930||ORU^R01|CNTRL-3456|P|2.4 
PID|||555-44-4444||EVERYWOMAN^EVE^E^^^^L|JONES|196203520|F|||153 FERNWOOD DR.^^STATESVILLE^OH^35292||(206)3345232|(206)752-121||||AC555444444||67-A4335^OH^20030520 
OBR|1|845439^GHH OE|1045813^GHH LAB|1554-5^GLUCOSE|||200202150730||||||||555-55-5555^PRIMARY^PATRICIA P^^^^MD^^LEVEL SEVEN HEALTHCARE, INC.|||||||||F||||||444-44-4444^HIPPOCRATES^HOWARD H^^^^MD 
OBX|1|SN|1554-5^GLUCOSE^POST 12H CFST:MCNC:PT:SER/PLAS:QN||^182|mg/dl|70_105|H|||F 




New message: 


OBX|1|SN|1554-5^GLUCOSE^POST 12H CFST:MCNC:PT:SER/PLAS:QN||^182|mg/dl|70_105|H|||F55^PRIMARY^PATRICIA P^^^^MD^^LEVEL SEVEN HEALTHCARE, INC.|||||||||F||||||444-44-4444^HIPPOCRATES^HOWARD H^^^^MD 

Mon fichier ressemble:

MSH|^~\&|GHH LAB|ELAB-3|GHH OE|BLDG4|200202150930||ORU^R01|CNTRL-3456|P|2.4 
PID|||555-44-4444||EVERYWOMAN^EVE^E^^^^L|JONES|196203520|F|||153 FERNWOOD DR.^^STATESVILLE^OH^35292||(206)3345232|(206)752-121||||AC555444444||67-A4335^OH^20030520 
OBR|1|845439^GHH OE|1045813^GHH LAB|1554-5^GLUCOSE|||200202150730||||||||555-55-5555^PRIMARY^PATRICIA P^^^^MD^^LEVEL SEVEN HEALTHCARE, INC.|||||||||F||||||444-44-4444^HIPPOCRATES^HOWARD H^^^^MD 
OBX|1|SN|1554-5^GLUCOSE^POST 12H CFST:MCNC:PT:SER/PLAS:QN||^182|mg/dl|70_105|H|||F 

Edit: solution à mon problème était: Supprimez '\ r' dans le message codé en dur ou les ajouter dans mon fichier. Mais après que j'ai besoin d'eux pour le traitement ultérieur, je les ai simplement ajoutés dans mon dossier qui a résolu mon problème.

+0

Les cordes sont ** pas ** la même chose car votre chaîne codée en dur contient les retours chariot \ r'. –

Répondre

2

Lorsque Python lit un fichier texte, les séparateurs de ligne sont convertis à \n par défaut. Sur les lignes Windows sont séparés par \r\n, mais dans Python vos lignes se terminera par \n.

Votre chaîne codée en dur, cependant, contient \r caractères de retour chariot, les lignes lues dans le fichier ne le seront pas.

Et si la dernière ligne n'a pas de séparateur de ligne, vous finirez par supprimer le dernier caractère, inconditionnellement. Utilisez line.rstrip('\n') pour supprimer les nouvelles lignes, mais uniquement si elles sont présentes.

Chaque fois que vous pensez que vous avez la même chaîne mais que Python vous dit quelque chose de différent, jetez un oeil à la sortie du repr() function pour ces chaînes (utilisez ascii() sur Python 3). Vous pouvez également utiliser le difflib.ndiff() function pour obtenir une indication rapide de ce qui pourrait être différent.

Dans votre cas, apparaît que vous ne supprimez pas (assez) de caractères de nouvelle ligne et que votre message de test contient \r caractères à la place. Cela signifie que le texte message2se remplacera ligne par ligne car il ne passera pas à la ligne suivante. Utilisez \n à la place; vous pouvez même utiliser une chaîne triple cité pour préserver les nouvelles lignes:

message2 = '''\ 
MSH|^~\&|GHH LAB|ELAB-3|GHH OE|BLDG4|200202150930||ORU^R01|CNTRL-3456|P|2.4 
PID|||555-44-4444||EVERYWOMAN^EVE^E^^^^L|JONES|196203520|F|||153 FERNWOOD DR.^^STATESVILLE^OH^35292||(206)3345232|(206)752-121||||AC555444444||67-A4335^OH^20030520 
OBR|1|845439^GHH OE|1045813^GHH LAB|1554-5^GLUCOSE|||200202150730||||||||555-55-5555^PRIMARY^PATRICIA P^^^^MD^^LEVEL SEVEN HEALTHCARE, INC.|||||||||F||||||444-44-4444^HIPPOCRATES^HOWARD H^^^^MD 
OBX|1|SN|1554-5^GLUCOSE^POST 12H CFST:MCNC:PT:SER/PLAS:QN||^182|mg/dl|70_105|H|||F''' 
+0

Dans ce cas je veux garder le '\ r' pour un traitement ultérieur, mais je n'ai pas vu que dans message2 il y avait '\ r' aussi. Mais en ajoutant '\ r' dans mon fichier texte tout fonctionne, merci! –

0

Essayez de lire le fichier correctement, et non via stdin, pour éviter caractères de contrôle de jouer avec elle:

import sys 

message = '' 
message2 = 'MSH|^~\&|GHH LAB|ELAB-3|GHH OE|BLDG4|200202150930||ORU^R01|CNTRL-3456|P|2.4\r' 
message2 += 'PID|||555-44-4444||EVERYWOMAN^EVE^E^^^^L|JONES|196203520|F|||153 FERNWOOD DR.^^STATESVILLE^OH^35292||(206)3345232|(206)752-121||||AC555444444||67-A4335^OH^20030520\r' 
message2 += 'OBR|1|845439^GHH OE|1045813^GHH LAB|1554-5^GLUCOSE|||200202150730||||||||555-55-5555^PRIMARY^PATRICIA P^^^^MD^^LEVEL SEVEN HEALTHCARE, INC.|||||||||F||||||444-44-4444^HIPPOCRATES^HOWARD H^^^^MD\r' 
message2 += 'OBX|1|SN|1554-5^GLUCOSE^POST 12H CFST:MCNC:PT:SER/PLAS:QN||^182|mg/dl|70_105|H|||F' 

with open("my_file.txt","r") as my_file: 
    for line in my_file: 
    message += line 

print message 
print '\n\n' 
print "New message:\n\n" 
print message2