2009-11-04 3 views
1

파일을 데이터베이스에 삽입 할 수 있도록 파일을 포맷하려합니다.이 파일은 원래 압축되어 있으며 크기는 1.3MB입니다.parse.unquote_plus TypeError

Village_Parsed = Village_Parsed + urllib.parse.unquote_plus(line); 

file "C:\Python31\lib\urllib\parse.py", line 404, in unquote_plus string = string.replace('+', ' ') TypeError: expected an object with the buffer interface

: 나는이 프로그램을 실행하면

Village = gzip.open(Root+'\\data'+'\\' +str(Newest_Date[0])+'\\' +str(Newest_Date[1])+'\\' +str(Newest_Date[2])\ 
       +'\\'+str(Newest_Date[3])+' village.gz'); 
Village_Parsed = str 
for line in Village: 
    Village_Parsed = Village_Parsed + urllib.parse.unquote_plus(line); 
print(Village.readline()); 

내가이 오류 :

398,%7EAnoniem+001%7E,543,480,7525010,1775,0

코드가 어떻게 보이는지 이것은이 파일을 구문 분석 : 각 라인은 다음과 같이 보입니다

무엇이 잘못 되었습니까? 사전에 도움을 주셔서 감사합니다.

답변

0
import gzip, os, urllib.parse 

archive_relpath = os.sep.join(map(str, Newest_Date[:4])) + ' village.gz' 
archive_path = os.path.join(Root, 'data', archive_relpath) 

with gzip.open(archive_path) as Village: 
    Village_Parsed = ''.join(urllib.parse.unquote_plus(line.decode('ascii')) 
          for line in Village) 
    print(Village_Parsed) 

출력 :

 
398,~Anoniem 001~,543,480,7525010,1775,0 

참고 : RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax 말한다 :

따라서 'ascii' line.decode('ascii') 조각에

This specification does not mandate any particular character encoding for mapping between URI characters and the octets used to store or transmit those characters. When a URI appears in a protocol element, the character encoding is defined by that protocol; without such a definition, a URI is assumed to be in the same character encoding as the surrounding text.

이 텍스트를 인코딩하는 데 사용했습니다 어떤 인코딩 문자로 교체해야합니다.

+0

@JFSebastian : 실제로 해 보았습니까? OP와 정확히 같은 오류가 발생합니다 ... 초기화 문제와 별개로 코드는 기능상으로 반환되는 바이트 객체와 같습니다. –

+0

@ John Machin : 나는 그것을 시도했다 (지금). 'unquote_plus_from_bytes'를 찾을 수 없으므로 명시적인'bytes.decode' 메소드에 의존해야합니다. – jfs

+0

감사합니다. 솔루션이 훌륭하게 작동하고 다른 실수 (Machin 및 Sebestian)를 지적 해 주셔서 감사합니다. ascii가 사용 된 문자 인코딩인지는 확실하지 않지만 볼 수있는 한 문제없이 작동합니다. – user202459

2

문제점 1은 urllib.unquote_plus가 귀하가 제공 한 line을 좋아하지 않는다는 것입니다. 메시지가 될 당신이 아래의 문제가이 문제를 해결하는 것이 좋습니다 :-) "는 STR 객체를 제공하십시오", 삽입해야합니다

print('line', type(line), repr(line)) 

즉시 for 문 다음에 당신은 당신이 line에지고있는 것을 볼 수 있도록.

당신은 그것을 반환하는 찾을 개체 바이트 : 'R'의 모드를 사용

>>> [line for line in gzip.open('test.gz')] 
[b'nudge nudge\n', b'wink wink\n'] 

을 부족한 결과가되어,

>>> [line for line in gzip.open('test.gz', 'r')] 
[b'nudge nudge\n', b'wink wink\n'] 

내가 제안하는 대신 파싱 루틴 당신에게 line를 전달 line.decode('UTF-8') ... 또는 gz 파일을 작성할 때 사용 된 인코딩.

문제 2는이 라인이다

Village_Parsed = str 

str는 유형이다. 빈 str 객체가 필요합니다. 그것을 얻으려면, 당신은 이상한/공식적으로 올바른하지만 비현실적이다 str() 즉 유형을 부를 수/scoffable/이상한 문자열 상수 ''를 사용하여 비교했을 때 ... 그래서이 수행 또한 문제 삼을

Village_Parsed = '' 

을 : 마지막 문장은 EOF 다음에 gz 파일을 읽으려고합니다.