为什么 python 打印延迟?
Why python print is delayed?
我正在尝试使用请求下载文件,每次检索 100k 大小的文件时打印一个点,但所有的点都在最后打印出来。见代码。
with open(file_name,'wb') as file:
print("begin downloading, please wait...")
respond_file = requests.get(file_url,stream=True)
size = len(respond_file.content)//1000000
#the next line will not be printed until file is downloaded
print("the file size is "+ str(size) +"MB")
for chunk in respond_file.iter_content(102400):
file.write(chunk)
#print('',end='.')
sys.stdout.write('.')
sys.stdout.flush()
print("")
正如@kevin 在评论中所写,respond.file.content
会阻止执行,直到下载完所有内容。我的回答和他的评论之间的唯一区别是我不是在猜测 ;)
这应该会如您所愿。获取 respond_file 的长度不是您想要的。而是检查 content-length header.
注意:我更改了代码以改为显示 KB(出于测试目的)。
import requests
import sys
file_url = "https://github.com/kennethreitz/requests/archive/master.zip"
file_name = "out.zip"
with open(file_name,'wb') as file:
print("begin downloading, please wait...")
respond_file = requests.get(file_url,stream=True)
size = int(respond_file.headers['content-length'])//1024
#the next line will not be printed until file is downloaded
print("the file size is "+ str(size) +"KB")
for chunk in respond_file.iter_content(1024):
file.write(chunk)
#print('',end='.')
sys.stdout.write('.')
sys.stdout.flush()
print("")
您正在此处访问 request.content
:
size = len(respond_file.content)//1000000
访问 属性 会强制下载整个响应,对于大型响应,这需要一些时间。使用 int(respond_file.headers['content-length'])
代替:
size = int(respond_file.headers['content-length']) // 1000000
Content-Length
header 由服务器提供,因为它是 header 的一部分,您无需先下载所有内容即可访问该信息。
如果服务器选择使用Transfer-Encoding: chunked
流式传输响应,则无需设置Content-Length
header;您可能需要考虑到这一点:
content_length = respond_file.headers.get('content-length', None)
size_in_kb = '{}KB'.format(int(content_length) // 1024) if content_length else 'Unknown'
print("the file size is", size_in_kb)
其中以千字节为单位的大小是通过将长度除以 1024 而不是 100 万来计算的。
或者,在单独的 HEAD 请求中询问大小(仅获取 headers):
head_response = requests.get(file_url)
size = int(head_response.headers.get('content-length', 0))
我正在尝试使用请求下载文件,每次检索 100k 大小的文件时打印一个点,但所有的点都在最后打印出来。见代码。
with open(file_name,'wb') as file:
print("begin downloading, please wait...")
respond_file = requests.get(file_url,stream=True)
size = len(respond_file.content)//1000000
#the next line will not be printed until file is downloaded
print("the file size is "+ str(size) +"MB")
for chunk in respond_file.iter_content(102400):
file.write(chunk)
#print('',end='.')
sys.stdout.write('.')
sys.stdout.flush()
print("")
正如@kevin 在评论中所写,respond.file.content
会阻止执行,直到下载完所有内容。我的回答和他的评论之间的唯一区别是我不是在猜测 ;)
这应该会如您所愿。获取 respond_file 的长度不是您想要的。而是检查 content-length header.
注意:我更改了代码以改为显示 KB(出于测试目的)。
import requests
import sys
file_url = "https://github.com/kennethreitz/requests/archive/master.zip"
file_name = "out.zip"
with open(file_name,'wb') as file:
print("begin downloading, please wait...")
respond_file = requests.get(file_url,stream=True)
size = int(respond_file.headers['content-length'])//1024
#the next line will not be printed until file is downloaded
print("the file size is "+ str(size) +"KB")
for chunk in respond_file.iter_content(1024):
file.write(chunk)
#print('',end='.')
sys.stdout.write('.')
sys.stdout.flush()
print("")
您正在此处访问 request.content
:
size = len(respond_file.content)//1000000
访问 属性 会强制下载整个响应,对于大型响应,这需要一些时间。使用 int(respond_file.headers['content-length'])
代替:
size = int(respond_file.headers['content-length']) // 1000000
Content-Length
header 由服务器提供,因为它是 header 的一部分,您无需先下载所有内容即可访问该信息。
如果服务器选择使用Transfer-Encoding: chunked
流式传输响应,则无需设置Content-Length
header;您可能需要考虑到这一点:
content_length = respond_file.headers.get('content-length', None)
size_in_kb = '{}KB'.format(int(content_length) // 1024) if content_length else 'Unknown'
print("the file size is", size_in_kb)
其中以千字节为单位的大小是通过将长度除以 1024 而不是 100 万来计算的。
或者,在单独的 HEAD 请求中询问大小(仅获取 headers):
head_response = requests.get(file_url)
size = int(head_response.headers.get('content-length', 0))