청크에서 Restresponse 읽기
-
20-12-2019 - |
문제
Python에서 MemoryError의 것을 피하기 위해 덩어리로 읽으려고합니다.덩어리를 읽는 방법에 대해 하루 반을 찾고 있지만 resteMponse하지만 아무 소용이 없도록하십시오.
소스는 Python 용 Dropbox SDK를 사용하는 파일과 같은 객체입니다.
여기에 나의 시도가 있습니다 :
import dropbox
from filechunkio import FileChunkIO
import math
file_and_metadata = dropbox_client.metadata(path)
hq_file = dropbox_client.get_file(file_and_metadata['path'])
source_size = file_and_metadata['bytes']
chunk_size = 4194304
chunk_count = int(math.ceil(source_size / chunk_size))
for i in range(chunk_count + 1):
offset = chunk_size * i
bytes = min(chunk_size, source_size - offset)
with FileChunkIO(hq_file, 'r', offset=offset,
bytes=bytes) as fp:
with open('tmp/testtest123.mp4', 'wb') as f:
f.write(fp)
f.flush()
.
이 결과는 "TypeError : 유니 코드로 강제 : 문자열 또는 버퍼가 필요합니다. reshesponse
모든 단서 또는 해결책은 크게 감사 할 것입니다.
해결책
FileChunkIO
에 대해 아무 것도 알지 못하고 코드가 어디에 있는지 아는 것이 아는 것이 아니라 확실히 확신하기가 어렵지만 실제 파일과 같은 객체가 필요하다는 것입니다. 또는 어쩌면 어리석은 일을하지 않으므로 타입을 확인하는 것과 같은 것과 같이 문자열이나 덩어리 파일을 청크를 찾는지 결정할 수 있습니다.
어쨌든, RESTResponse
가 아닙니다. 전체 파일 모양의 객체는 read
및 close
를 구현합니다. 그리고 멋진 래퍼없이 read
를 구현하는 쉽게 덩어리를 쉽게 청구 할 수 있습니다. 파일 모양 오브젝트 'read
메소드는 EOF에 도착하면 b''
를 반환 할 수 있으며 묻는 것보다 적은 수의 바이트를 반환 할 수 있으므로 read
에 필요한 횟수를 추측하고 짧은 읽기를 수행 할 필요가 없습니다. 종료. 그냥 해결하십시오 :
chunk_size = 4194304
with open('tmp/testtest123.mp4', 'wb') as f:
while True:
buf = hq_file.read(chunk_size)
if not buf:
break
f.write(buf)
.
(루프 외부에서 open
를 옮겼다는 것을 주목하십시오. 그렇지 않으면 각 청크에 대해 파일을 열고 비워두고 다음 덩어리를 씁니다. 그래서 끝에 끝날 것입니다. 마지막 것.)
chunking wrapper를 원한다면, 완벽하게 좋은 butolin 함수, iter
< / A>, 그럴 수있는 일 :
chunk_size = 4194304
chunks = iter(lambda: hq_file.read(chunk_size), '')
with open('tmp/testtest123.mp4', 'wb') as f:
f.writelines(chunks)
.
python 3.x에서 Python 3.x에서 똑같은 코드가 Python 3.x에서 ''
로 변경되었지만 파이썬 2.5를 중단합니다.
i 일반적으로 writelines
가 아닌 partial(hq_file.read, chunk_size)
로 작성하지만, 정말로 선호의 문제입니다. lambda: hq_file.read(chunk_size_
의 이유를 이해할 수 있어야합니다. 그들은 궁극적으로 동일한 효과를 가지고 있으며 어떤 것을 선호하는지 결정합니다.