2014-07-30 3 views
0

나는 txt 파일의 폴더를 통해 구문 분석을하고있다. 이 텍스트 파일에는 두 번째 줄에 Dell 컴퓨터 서비스 태그가 있습니다. 두 번째 줄을 잡고 CSV 스프레드 시트에 넣으 려합니다.이 문자열을 파이썬에서 올바르게 포맷하는 방법은 무엇입니까?

콘솔에 서비스 태그를 인쇄 할 때 txt 파일에서 읽으면 문제가 없습니다. 스프레드 시트 행에 입력 할 목록에 넣으면 서식이 잘못 지정됩니다. 무슨 일이 일어나고 어떻게해야합니까? 첫 번째 파일의

import glob 
import os 
#import csv 
#fileWriter = csv.writer(open('inventory.csv', 'wb'), delimiter=',') 
#fileWriter.writerow(["Computer Name", "Service Tag"]) 
for filename in glob.glob('*.txt'): 
    content = open(filename) 
    lines = content.readlines() 
    computer_name = os.path.splitext(filename)[0] 
    service_tag = lines[1] 
    row = [computer_name, service_tag] 
    print service_tag 
    print row 
    #fileWriter.writerow(row) 

샘플 출력 :

CBD1WL1 

[Computer-PC', '\x00C\x00B\x00D\x001\x00W\x00L\x001\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00\r\x00\n'] 
+0

두 번째 문자열의 예상 출력은 얼마입니까? –

+0

* txt 파일을 첨부 할 수 있습니까? –

+0

csv 파일에서 사용하는 인코딩을 알고 있습니까? 이 문제는 파이썬이 파일을 열 때 잘못된 인코딩을 가정하고있는 것 같습니다. – dano

답변

3

올바른 인코딩으로 파일을 열어야합니다. 파일이 utf-16으로 인코딩 된 것 같습니다.

>>> a = "blah\nCBD1WL1" 
>>> a.decode('utf-8').encode('utf-16') 
'\xff\xfeb\x00l\x00a\x00h\x00\n\x00C\x00B\x00D\x001\x00W\x00L\x001\x00' 

utf-16 인코딩 된 문자열의 시작은 BOM입니다있다 : 나는 인코딩 UTF-16 꽤 확신

import glob 
import os 
import io 
#import csv 
#fileWriter = csv.writer(open('inventory.csv', 'wb'), delimiter=',') 
#fileWriter.writerow(["Computer Name", "Service Tag"]) 
for filename in glob.glob('*.txt'): 
    content = io.open(filename, encoding='utf-16') 
    lines = content.readlines() 
    computer_name = os.path.splitext(filename)[0] 
    service_tag = lines[1] 
    row = [computer_name, service_tag] 
    print service_tag 
    print row 
    #fileWriter.writerow(row) 

: 당신은 utf-16 인코딩 파일을 읽을 수 io.open을 사용할 수 있습니다 \xff\xfeb 부분. 이 코드는 파일의 첫 번째 줄에 있으며 코드에서 버립니다. 그 다음에 정확히 \x00<character you expect>으로 표시됩니다.

+0

이렇게했습니다. 감사. 또한 .strip()을 11 행에 추가하여 서비스 태그 다음에 여분의 공백을 제거했습니다. –

2

그래서 나는 두 번째 문자열의 출력에 null 문자를 참조하십시오. 원본 파일에이 파일이있는 것 같습니다. 해당 코드를 제거하려면 아래 코드를 사용하십시오.

row[1] = row[1].replace('\x00','').strip() 

출력은 유효한 서비스 태그 인 것처럼 보일 수 있지만 나는 알 수 없습니다.

+2

이 문제를 해결할 수 있지만 실제 문제는 잘못된 인코딩을 사용하여 파일을 여는 것입니다. – dano

관련 문제