Python的字符串处理

问题描述:

我已经开始在蟒蛇再次编码,我偶然发现了一个奇怪的现象:我有两个字符串这是完全一样的(见下面的代码),但这些字符串的一个存储在一个文件,其他一个是硬编码的。现在我的程序正在运行,但是与硬编码字符串相比,文件中的字符串在输出中看起来完全不同。为什么?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

当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

尝试正确读取该文件,而不是通过标准输入,避免控制字符,它搞乱:

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