문제

파일을 데이터베이스에 삽입 할 수 있도록 파일을 형식화하려고합니다. 파일은 원래 압축되어 1.3MB 크기입니다. 각 줄은 다음과 같습니다.

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

이것이 코드 가이 파일을 구문 분석하는 방식입니다.

   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());

프로그램을 실행하면이 오류가 발생합니다.

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

"c : python31 python31 lib urllib parse.py", line 404, unquote_plus string = string.replace ( '+', '') typeerror : 버퍼 인터페이스가있는 객체가 예상됩니다.

여기에 무엇이 잘못되었는지 아십니까? 도움을 주셔서 미리 감사드립니다 :)

도움이 되었습니까?

해결책

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- 균일 자원 식별자 (URI) : 제네릭 구문 말 :

이 사양은 URI 문자와 해당 문자를 저장하거나 전송하는 데 사용되는 옥팅 간의 매핑을위한 특정 문자 인코딩을 요구하지 않습니다. URI가 프로토콜 요소에 나타날 때, 문자 인코딩은 해당 프로토콜에 의해 정의됩니다. 그러한 정의가 없으면 URI는 주변 텍스트와 동일한 문자 인코딩으로 가정됩니다.

그러므로 'ascii' 에서 line.decode('ascii') 조각은 텍스트를 인코딩하는 데 사용한 문자 인코딩으로 대체해야합니다.

다른 팁

문제 1은 urllib.unquote_plus가 마음에 들지 않는다는 것입니다 line 당신이 그것을 먹였습니다. 메시지는 "str 객체를 제공하십시오":-) 아래의 문제 2를 고치고 삽입하는 것이 좋습니다.

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

당신의 직후 for 당신이 무엇을 얻고 있는지 볼 수 있도록 진술 line.

바이트 객체를 반환한다는 것을 알게됩니다.

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

'r'모드를 사용하면 효과가 있습니다.

>>> [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 객체가 필요합니다. 그것을 얻으려면 IE 유형을 호출 할 수 있습니다. str() 문자열 상수를 사용하는 것과 비교할 때 공식적으로 정확하지만 실용적이지 않지만 비현실적/비정상적/비웃을 수있는/이상한 것입니다. '' ... 그래서 이것을합니다 :

Village_Parsed = ''

또한 문제 3이 있습니다. 마지막 진술은 EOF 이후 GZ 파일을 읽으려고합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top