2010-11-25 5 views
2

파이썬 스크립트를 사용하여 처리하려는 데이터가 많은 파일이 있습니다.텍스트 파일에서 알 수없는 문자 제거

파일은 알 수없는 인코딩이며 메모장 ++에서 열면 'null'문자로드로 구분 된 숫자 데이터가 포함됩니다 (메모장 ++에서는 검은 색 바탕에 흰색으로 NULL로 표시됨).

이 처리하기 위해, 나는 널 문자 \의 x00에서하여 파일을 분리하고 다음 스크립트를 사용하는 경우에만 숫자 값을 검색 :로 (

stripped_data=[] 
for root,dirs,files in os.walk(PATH): 
    for rawfile in files: 
     (dirName, fileName)= os.path.split(rawfile) 
     (fileBaseName, fileExtension)=os.path.splitext(fileName) 
     h=open(os.path.join(root, rawfile),'r') 
     line=h.read() 
     for raw_value in line.split('\x00'): 
      try: 
       test=float(raw_value) 
       stripped_data.append(raw_value.strip()) 
      except ValueError: 
       pass 

그러나, 때때로 파일에있는 다른 인식 할 수없는 문자가를 내가 처음 발견 한 것만 큼) - 메모장에 'EOT', 'SUB'및 'ETX'로 표시됩니다. 그것들은 파이썬에서 파일의 처리를 방해하는 것처럼 보입니다. 메모장에 분명히 더 많은 데이터가 있음에도 불구하고 파일은 그 문자로 끝난 것처럼 보입니다.

처리하기 전에 이러한 파일에서 비 ASCII 문자를 모두 제거하려면 어떻게합니까?

+2

알 수없는 인코딩에서 파일이 올바른 경우 일부 인코딩이 적합한 것으로 보이고 해당 인코딩의 파일을 읽으려는 경우 일부 논리를 사용하려고 할 수 있습니다. 거기에 몇 가지 라이브러리/예제 코드가 있어야합니다. (메모장 + +는 특정 인코딩으로 파일을 열 때 적합하다고 생각하는 파일을 엽니 다.) 옵션이 아니라면 ... 아래 답변을 참조하십시오. – Kissaki

+0

내가 맞는 인코딩을 찾을 수 없습니다 - 다소 이상한 형식이라고 생각합니다. – meepmeep

+0

파일의 레이아웃과 인코딩을 결정할 때 질문을 할 경우 많은 도움이됩니다 ...(1) 파일의 소스 (어떤 웹 사이트가 어떤 소프트웨어를 생성하는지)와 같은 세부 정보 포함 (2) 파일의 처음 몇 바이트의 내용 표시 ... print repr (open ('afile.ext', 'rb'). read (200)) ' –

답변

5

텍스트 모드에서 파일을 여는 중입니다. 즉, 첫 번째 Ctrl-Z 문자는 파일 끝 문자로 간주됩니다. open()에서 'r'대신 'rb'를 지정하십시오.

+0

와우를 간단하게 볼 수 있습니다. 완벽하게 작동합니다, 감사합니다! – meepmeep

1

이 확실히 작동하는지 모르겠어요,하지만 당신은 codec 모듈의 입출력 방법을 사용하여 시도 할 수 :

import codec 

inFile = codec.open(<SAME ARGS AS 'OPEN'>, 'utf-8') 
for line in inFile.readline(): 
    do_stuff() 

당신은 그냥 보통의 파일 객체처럼 inFile을 처리 할 수 ​​있습니다.

아마도 도움이 될 수도 있지만 도움이 될 수도 있습니다.

기본적으로

바꿀 것 [편집] : h=open(os.path.join(root, rawfile),'r')

+0

나는 h = codecs.open (os.path.join (root, rawfile),'r ','utf-8 ')을 읽어야한다고 가정합니다. '코덱은 8-10 위치의 바이트를 디코딩 할 수 없습니다 : 잘못된 데이터' – meepmeep

1

h=open(os.path.join(root, rawfile),'r', 'utf-8')과의 file.read() 함수가 EOF 때까지 읽습니다. EOF를 치를 때조차도 파일을 계속 읽으려는 것이 너무 일찍 중지되었다고 말했습니다. 전체 파일을 읽었을 때 반드시 멈추십시오. EOF를 때 파일 크기 (읽기 전에 파일 크기를 읽었을 때)를 멈출 때 file.tell()을 통해 파일의 위치를 ​​확인하여이를 수행 할 수 있습니다.

다소 복잡하기 때문에 file.next을 사용하고 바이트를 반복 할 수 있습니다.

ASCII 문자가 아닌 문자를 제거하려면 특정 문자에 흰색 목록을 사용하거나 정의 된 범위와 비교하여 Byte 읽기를 검사 할 수 있습니다. 예. x30과 x39 사이의 바이트 (숫자) -> 그것을 보관/어딘가에 저장/문자열에 추가. ASCII table을 참조하십시오.

+0

.next() 문서를 읽는 것은 실제로 행을 반환합니다. 그래서 이것은 그렇게 많이 도움이되지 않습니다. 당신은 나의 첫번째 단락으로 돌아 가야 할 것입니다. EOF가 발생하면 가능한 한 멀리 읽으십시오. 파일 끝 (.tell() 및 file-size 비교)을 확인하고 그렇지 않은 경우 읽기 (바이트를 탐색해야 할 수도 있습니다. EOF를 치면 자동으로 실행되지 않습니다.) seek()에서 http://docs.python.org/library/stdtypes.html#file.seek – Kissaki

관련 문제