2012-12-20 3 views
3

매우 특이한 문제가 있습니다. bulkSMS 게이트웨이에 대한 API 호출을 만들기 위해 Python 2.6을 사용하고 있습니다. 지금은 만들 경우이파이썬에서 변수 할당을 변경합니다.

req = urllib2.Request(url) 
urllib2.urlopen(req).read() 

같은 호출 I 단자

'<RESPONSE>\r<status>-4</status>\r<credits>31.3403</credits>\r</RESPONSE>' 

그러나 다시 인쇄이 (올바른) 응답을 나는 변수이 출력,

reply = urllib2.urlopen(req).read() 

I를 할당 할 때 내가 터미널에 인쇄 할 때이 (잘못된) 응답을

print reply 
</RESPONSE>.3403</credits> 

아무도 여기서 신경 쓰지 않아?

답변

3

\r 문자를 특수 문자 (ASCII 캐리지 리턴 - 일부 예제의 경우 here 참조)로 해석하고 인쇄시 문자열에서 제거합니다. 귀하의 경우

In [1]: resp = '<RESPONSE>\r<status>-4</status>\r<credits>31.3403</credits>\r</RESPONSE>' 

In [2]: print resp 
</RESPONSE>.3403</credits> 

In [3]: print resp.encode('string-escape') 
<RESPONSE>\r<status>-4</status>\r<credits>31.3403</credits>\r</RESPONSE> 

직접 적용 할 수 없음하지만 탈출 이런 종류의 수행 또 다른 방법은 그것을 '원시'문자열을 만드는, r로 문자열을 접두사로 사용하는 것입니다 :를 포함하려면, 당신은 string-escape 인코딩을 사용할 수 있습니다 그리고 백 슬래시를 유지 (이 정규 표현식에 많이 볼 수 있습니다) :

In [4]: resp = r'<RESPONSE>\r<status>-4</status>\r<credits>31.3403</credits>\r</RESPONSE>' 

In [5]: print resp 
<RESPONSE>\r<status>-4</status>\r<credits>31.3403</credits>\r</RESPONSE> 
+0

덕분에,이, 날 위해 일했습니다. – user1048839

+0

@ user1048839 신난다. 다행이다. 모든 것에 행운을 빈다. – RocketDonkey

2

문자열이 올바른 데이터를 포함, 그냥 이상한 방법으로 인쇄합니다. \r은 캐리지 리턴이며 일부 시스템에서는 "줄의 처음으로 돌아가서 거기에서 덮어 쓰기를 시작합니다"라고 해석합니다. 따라서 "</RESPONSE>"과 이전 줄의 데이터가 더 길 었으며 덮어 쓰지 않았습니다.

는 그것은 요즘 줄 끝 규칙으로 그 일반적이지 이후 데이터가 \r 포함되어 있는지 조금 이상한.

\r이 해석되지 않고 응답을 보려면 repr(response)을 인쇄 할 수 있습니다. 모든 데이터가 거기에 있기 때문에 라인에서 처리하는 것은 잘 작동 할 것입니다. 단지 인쇄가 아닙니다. 아직도의 원래 형태 변수의 내용을 유지하면서

+0

+1 - 줄의 시작 부분으로 위치를 다시 설정하는 좋은 점. – RocketDonkey

+0

네, 이것이 정확하게 문제입니다. 필요한 경우,'reply.replace ("\ r", "\ n")'로 문자열을 고칠 수 있습니다. 그러면 캐리지 리턴 대신에 개행 문자를 넣을 수 있습니다. – Blckknght

+0

매우 잘못된 문자 'R'을 대체 안넘어하지만 기본적으로 내가 너무 다른 기능을 통해 그것을 사용되기 때문에 가능한 한 원본에 가깝게 유지하고 싶은 회신의 내용을 변경하는 것을 의미한다. – user1048839

관련 문제