Python字符串处理

2024-09-26 18:08:43 发布

您现在位置: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

输出:

^{pr2}$

我的文件看起来像:

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'或将它们添加到我的文件中。但在我需要它们进行进一步处理之后,我只需将它们添加到我的文件中就解决了我的问题。在


Tags: 文件字符串代码message编码syslabmd
2条回答

尝试正确读取文件,而不是通过stdin,以避免控制字符弄乱它:

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

当Python读取文本文件时,行分隔符将从平台默认值转换为\n。在Windows上,行用\r\n分隔,但在Python中,行将以^{结尾。

但是,您的硬编码字符串包含\r回车字符,从文件中读取的行不会

如果最后一行没有行分隔符,不管怎样,你都会无条件地删除最后一个字符。使用line.rstrip('\n')删除换行符,但仅当存在时才使用。

每当您认为您有相同的字符串,但Python告诉您一些不同的东西时,请查看这些字符串的^{} function的输出(在python3上使用^{})。您还可以使用^{} 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'''

相关问题 更多 >

    热门问题