2010-04-26 4 views
0

Windows 공급자로부터 700MB의 XML 파일이 있습니다.Python에서 Windows 줄 끝 처리하기

줄 끝은 '\ r \ n'(또는 vi의^M)입니다. 미친 것 같다 rstrip() (파일을 열 필요 '\ n'을 :-)

  1. 사용 os.linesep
  2. 사용 ... 이상 보낼 수있는 공급 업체를 얻기 제외하고이 상황을 처리하는 가장 효율적인 방법은 무엇입니까)
  3. Universal newline support을 사용하면 Mac Snow Leopard에서 표준이 아니므로 옵션이 아닙니다.

필자는 Python 2.6 이상이 필요하지만 최소한의 외부 요구 사항으로 Snow Leopard 및 Ubuntu 9.10에서 작동해야합니다. 나는 작은 성능 페널티는 신경 쓰지 않지만 이것을 다루는 표준 최선의 방법을 찾고있다.

---- 편집 ----

엔딩 태그 기술자의 중간에있는 선은, 그렇지 않은 경우는 문제가되지 않을 것입니다. 나는 이것이 나쁜 형태이고 그것이 나에게 이것을 보내면 안된다는 것을 알고있다. 그러나 이것이 내가 파일을 갖고있는 방법이며 공급 업체는 대부분 무능력하다.

+0

그래서 공백이 필요한지 어떻게 알 수 있습니까? 분명히 공백을 모두 제거 할 수는 없습니다. 예 : 이 문제가 발생하면 어떻게 ''을 붕괴 시키시겠습니까? –

답변

1

Allegedly : "" "이 사람은 \ r \ n 태그 설명자 중간에 있습니다 : <ParentRedirec tSequenceID>" "".

여기에 no \r\n이 표시됩니다. 아마 당신이에 repr (XML)를

"<ParentRedirec\r\ntSequenceID>" 

그렇지 않으면 같은 것들을 포함하고 의미를 repr 패션 으로, 정확하게 당신이 무슨 뜻인지 말을하려고합니다.

다음 작업을해야합니다 :

>>> import re 
>>> guff = """<atag>\r\n<bt\r\nag c="2">""" 
>>> re.sub(r"(<[^>]*)\r\n([^>]*>)", r"\1\2", guff) 
'<atag>\r\n<btag c="2">' 
>>> 

을 태그에 하나 이상의 줄 바꿈 예를 들어,이있는 경우 <foo\r\nbar\r\nzot> 이것은 첫 번째 만 수정합니다. guff가 줄어들 때까지 루프 (1) 반복 (2) 똑똑한 정규 표현식을 쓰십시오 :-)

+0

정확합니다. 주석 시스템이 개행을 제거하고 태그는 다음과 같습니다. "" –

0

이 파일로 무엇을하려고하십니까? 태그 사이의 공백은 일반적으로 XML에서 무시되므로 줄 끝이 태그의 내용과 관련이있는 유일한 장소입니다.

+0

이 사람은이 \ 연구 \ n은 바로 지금과 같은 태그 기술자의 중간에 : 나는 그들이 자신의 말에 끼 선호 많은 것 그러나 나는 급한 가지이야 그냥 원하는 이 물건들을 벗겨 내고. –

+0

그럴 경우 모든 경우에 문제가 발생합니다. \ r \ n 대신 \ n을 사용하면 차이가 없습니다. –

+0

모든 종류의 줄 바꿈을 제거하려고 생각했지만 블록 중 일부가 실제 데이터의 일부인 유효한 줄 바꿈을 사용하기 때문에 작동하지 않는다는 것을 알게되었습니다. –

5

왜 DOS 라인 엔딩이 문제입니까? 대부분의 것들은 XML 파서를 포함하여 잘 처리 할 수 ​​있습니다. 당신이 정말로 그들을 제거하려는 경우, universal line-endings 모드에서 파일을 엽니 다

open(filename, 'rU') 

파이썬은 유닉스 라인 엔딩에 대한 모든 라인 엔딩을 변환합니다. 당신이 정말로 그것을 사용할 수 없다면 (조금 놀랍습니다), 파이썬이 당신을 위해 일하도록 할 수있는 방법이 없습니다. 상관없이 파일을 열어야하므로 # 2에 대한 귀하의 이의가 조금 이상하게 보입니다.

+0

huh, 그냥 (다시) 문서를 읽으십시오 - U가 보편적 인 새 줄 지원을 켜는 데 "필수"였는지 결코 알지 못합니다 ... 대부분 내 작업은 Windows에서 유닉스 개행은 우아하게 처리됩니다 ... –

+1

The MS C 런타임이 라인 엔딩을 변환하는 Windows에서의 텍스트 모드 읽기는 파이썬의 범용 라인 엔딩 지원과 동일하지 않습니다. 범용 행 끝은 모든 운영 체제에서 동일합니다. Windows 텍스트 모드는 Windows에만 해당되며 EOF 문자와 같은 다른 요소에도 영향을 미칩니다. –

+0

내 시스템에서는 유니버설 새 행을 사용할 수 없습니다. –

2

파일을 텍스트 모드 또는 이진 모드로여시겠습니까? 나는 레오파드 설치시 보편적 인 개행을 계산했지만, 아마도 어딘가에서 업데이트 된 파이썬을 얻었을지도 모른다. ...

어쨌든 - 나는 부랑연에서 많은 프로그래머를 물어 뜯는 이런 종류의 것을 보았다. 왜냐하면 그들은 단지 'b'키에 도달하기 때문입니다. 플랫폼에 생성 된 것으로 알려진 텍스트 파일을 여는 경우 't'를 사용하고, 보편적 인 개행이 필요한 경우 't'대신 'U'를 사용하십시오.

with file(filename, 'rt') as f: 
    content = f.read() 

편집 : 주석은 'RT'는 기본이다 있습니다. 공정한 점이지만 파이썬 스타일은 암묵적인 것보다 명시 적으로 선호하는 경향이 있으므로 나는 그걸로 갈 것입니다.

+0

ok 대답에 가장 가까운. 나는 지금 깨달은 더 나은 파일이 필요하다. –

+0

어디서나 기본 모드가 아닌't '에 대해 처음 들어 본 적이 있습니다. 이걸 좀 더 자세히 설명해 주실 수 있습니까? ''rt''는''r''과 정말로 다른가요? 기본값은 정말로''b''입니까, 아니면 세 번째 모드입니까? –

+0

게시 후 문서를 검토했습니다. 나는 't'가 내가 본 것에 기초한 디폴트라고 의심하지만 암묵적인 것보다 명시 적으로 낫다고 생각한다. :) 어쨌든 나는 텍스트 파일을 다룰 때에도 많은 사람들이 기본적으로 거기에 'b'를 던지는 것을 보았다. boggles하지만 그 일이 일어난다. 그래서 나는 물었다. ;) –

관련 문제