문제

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 가 아닙니다. 전체 파일 모양의 객체는 readclose를 구현합니다. 그리고 멋진 래퍼없이 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를 중단합니다.

이것은 실제로 라인이 아닌 문자열이 아닌 뱃지를 쓸 수있는 낙하 할 수 있기 때문에 b''의 남용이 약간있을 수 있습니다. 당신이 그것을 좋아하지 않으면 명시적인 루프가 단순하고 간결하지 않고 훨씬 적은 것과 같습니다.

i 일반적으로 writelines가 아닌 partial(hq_file.read, chunk_size)로 작성하지만, 정말로 선호의 문제입니다. lambda: hq_file.read(chunk_size_ 의 이유를 이해할 수 있어야합니다. 그들은 궁극적으로 동일한 효과를 가지고 있으며 어떤 것을 선호하는지 결정합니다.

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