인쇄하는 방법""점을(또는 다른 종류의 피드백)쓰는 동안 파일에서는 파이썬?

0

질문

내가 노력하고 인쇄 보드 사용자는 터미널에서 내 aplication donwloads 웹에서 파일에 기록으로는 하드 드라이브 하지만,나는 어떻게 찾을 수 없습니다 이를 위해 설명서를 읽어 또는 인터넷 검색니다.

이것은 나의 코드:

res = requests.get(url_to_file)
with open("./downloads/%s" % (file_name), 'wb') as f:
    f.write(res.content)

내가 기대하는 그림을 만드는 방법은 무언가 이것을 좋아한다:

Downloading file ........
 # it keeps going ultil the download is finished and the file writen
Done!

나는 진짜로 strugling 도 시작하기 때문에 아무도 방법들을 통해 반환하"약속"을(JS).

어떤 도움이 될 것이 매우 apreciated! 감사합니다!

file promise python
2021-11-24 05:40:54
2

최고의 응답

3

requests.get 기본적으로 다운로드 전체의 요청된 자원이기 전에 그것을 다시 가져옵니다. 그러나,그것은 선택적 인수 stream할 수 있는 호출 .iter_content.iter_linesResponse 체입니다. 이 조치를 취할 수 있습 N 바이트(또는 각 부분의 데이터 도착한),또는에서 모든 라,각각합니다. 무언가 이것을 좋아한다:

chunks = []
chunk_size = 16384     # 16Kb chunks
# alternately
# chunk_size = None    # whenever a chunk arrives
res = requests.get(url_to_file, stream=True)
for chunk in res.iter_content(chunk_size):
    chunks.append(chunk)
    print(".", end="")
data = b''.join(chunks)

이것은 여전히 블록하지만,때문에 아무것도 다른 것입니다. 당신이 더 많은 것을 원하는 경우 자바스크립트,스타일별 Grismar 의 의견이 당신을 실행해야에서의 비동기 loop. 이 경우에는 사용하는 것이 좋 aiohttprequests으로 만들어진 비동기식 스타일에서 마음입니다.

2021-11-24 06:52:04

마에 대한 당신의 대답이다! 그것은 매우 빠르게! 하 나는 알았다고는 개념과 그것의 좋은 있다는 것을 알고 비동기 기능에 있습니다. 어떤 이유로도 사용할 aply 코드,그것은 단지 인쇄된 후 파일을 요청이 완료됩니다. 아마도 내가 설정했습니다....
guilfer
1

여기에 버전의 파일을 다운로드 bytearray 에서 별도의 thread.

에서 언급했듯이 다른 답변과 의견이 다른 alternativs 개발된 비동기업에서는 마음을 읽지 않으로 너무 많이 이동하기로 결정과 threading,그것은 단지 입증하는 개념(고 있기 때문에 편의,함께 제공하기 때문 python).

에서 아래 코드는 경우는 파일의 크기로 알려져 있고,각 . 것에 해당하는 1%. 보너스로,다운로드 총 바이트 수를 인쇄 할 수 있의 시작에서 다음과 같은 줄을 (1234 B / 1234567 B). 면 크기로 알려져 있지 않고,대체 솔루션은 각각의 . 을 나타내 덩어리.

import requests
import threading


def download_file(url: str):
    headers = {"<some_key>": "<some_value>"}
    data = bytearray()
    with requests.get(url, headers=headers, stream=True) as request:
        if file_size := request.headers.get("Content-Length"):
            file_size = int(file_size)
        else:
            file_size = None
        received = 0
        for chunk in request.iter_content(chunk_size=2**15):
            received += len(chunk)
            data += chunk
            try:
                num_dots = int(received * 100 / file_size)
                print(
                    f"({received} B/{file_size} B) "
                    + "." * num_dots, end="\r"
                )
            except TypeError:
                print(".", end="")
        print("\nDone!")

url = "<some_url>"
thread = threading.Thread(target=download_file, args=(url,))
thread.start()
# Do something in the meantime
thread.join()

는 것을 명심하십시요 나는 왼쪽으로 잠금을 보호에 대하여 동시에 액세스 stdout 하는 소음을 줄일 수 있습니다. 나도 왼쪽으로 쓰 bytarray 하는 파일의 끝에서(또는 쓰기 덩어리를 파일로 그들은받은 파일이 큰 경우),그러나 유지 하는 마음에 사용할 수 있는 잠금에 대한뿐만 아니라 당신이 읽고 쓰기 같은 파일에 어떤 다른 부분의 스크립트입니다.

2021-11-24 05:57:53

는 가장 최고! 나는 개념을 이해해 하지만 나는 상당히 새로운 python 과하기로 결정했 쉬운 방법이요 나는 북마크의 answaer 고 한 빨리하는 방법에 대한 자세한 내용은 threading 나는 확실히 거 revesit 니다! 많은 감사!
guilfer

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................