2014-09-19 137 views
0

我已經開始在蟒蛇再次編碼,我偶然發現了一個奇怪的現象:我有兩個字符串這是完全一樣的(見下面的代碼),但這些字符串的一個存儲在一個文件,其他一個是硬編碼的。現在我的程序正在運行,但是與硬編碼字符串相比,文件中的字符串在輸出中看起來完全不同。爲什麼?Python的字符串處理

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 

輸出:

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 

我的文件看起來像:

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 

編輯:解決我的問題是:無論是硬編碼信息中刪除 '\ r' 或添加他們我的文件。但是在我需要它們進行進一步處理之後,我只是將它們添加到我的文件中解決了我的問題。

+0

字符串是**不是**,因爲你的硬編碼字符串包含'\ r'回車符。 – 2014-09-19 09:24:35

回答

2

當Python讀取一個文本文件,行分隔符從平臺默認\n翻譯。在Windows上線與\r\n分離,但在的Python你的行會與\n結束。

你硬編碼字符串,但是,包含\r回車符,行從文件中讀取不會。

如果最後一行沒有行分隔符,你最終會消除反正最後一個字符,無條件地。使用line.rstrip('\n')可刪除換行符,但前提是存在。

只要你認爲你有相同的字符串,但Python告訴你不同的東西,看看這些字符串的輸出repr() function(在Python 3上使用ascii())。您也可以使用difflib.ndiff() function快速指示可能有什麼不同。

在你的情況下,它出現你沒有刪除(足夠)換行符,而你的測試消息包含\r字符。這意味着message2文本將逐行替換爲,因爲它不會前進到下一行。改爲使用\n;你甚至可以用一個三引號字符串保存換行符:

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

在這種情況下,我想保留'\ r'作進一步處理,但我在message2中沒有看到'\ r'。但是在我的文本文件中添加'\ r'一切正常,謝謝! – 2014-09-19 09:53:06

0

嘗試正確讀取該文件,而不是通過標準輸入,避免控制字符,它搞亂:

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