有哪些sys.stdout.write()情况比较好print?
(示例:更好的性能;更有意义的代码)
当我的脚本执行可能需要一些时间的任务时,如何使用进度条?
例如,一个需要一些时间才能完成并True在完成时返回的函数.如何在执行功能期间显示进度条?
请注意,我需要实时,所以我无法弄清楚该怎么做.我需要thread这个吗?我不知道.
现在我正在执行函数时不打印任何内容,但是进度条会很好.此外,我更感兴趣的是从代码的角度来看如何做到这一点.
我写一个小程序下载文件通过HTTP(如,例如,描述在这里).
我还想包含一个小的下载进度指示器,显示下载进度的百分比.
这是我想出的:
sys.stdout.write(rem_file + "...")
urllib.urlretrieve(rem_file, loc_file, reporthook=dlProgress)
def dlProgress(count, blockSize, totalSize):
percent = int(count*blockSize*100/totalSize)
sys.stdout.write("%2d%%" % percent)
sys.stdout.write("\b\b\b")
sys.stdout.flush()
输出:MyFileName ... 9%
还有其他想法或建议吗?
有点烦人的是在百分比的第一位数字中终端闪烁的光标.有办法防止这种情况吗?有没有办法隐藏光标?
编辑:
这里有一个更好的替代方法,在dlProgress和'\ r'代码中使用全局变量作为文件名:
global rem_file # global variable to be used in dlProgress
urllib.urlretrieve(rem_file, loc_file, reporthook=dlProgress)
def dlProgress(count, blockSize, totalSize):
percent = int(count*blockSize*100/totalSize)
sys.stdout.write("\r" + rem_file + "...%d%%" % percent)
sys.stdout.flush()
输出:MyFileName ... 9%
并且光标显示在行的END处.好多了.
背景:我正在使用urllib.urlretrieve,而不是urllib*模块中的任何其他功能,因为钩子功能支持(见reporthook下文)..用于显示文本进度条.这是Python> = 2.6.
>>> urllib.urlretrieve(url[, filename[, reporthook[, data]]])
Run Code Online (Sandbox Code Playgroud)
但是,它urlretrieve是如此愚蠢,以至于它无法检测HTTP请求的状态(例如:它是404还是200?).
>>> fn, h = urllib.urlretrieve('http://google.com/foo/bar')
>>> h.items()
[('date', 'Thu, 20 Aug 2009 20:07:40 GMT'),
('expires', '-1'),
('content-type', 'text/html; charset=ISO-8859-1'),
('server', 'gws'),
('cache-control', 'private, max-age=0')]
>>> h.status
''
>>>
Run Code Online (Sandbox Code Playgroud)
下载具有类似钩子支持的远程HTTP文件(显示进度条)和一个不错的HTTP错误处理的最着名的方法是什么?
我requests用来下载文件,但是对于大文件我需要每次检查磁盘上文件的大小,因为我无法显示百分比的进度,我也想知道下载速度.我怎么去做呢?这是我的代码:
import requests
import sys
import time
import os
def downloadFile(url, directory) :
localFilename = url.split('/')[-1]
r = requests.get(url, stream=True)
start = time.clock()
f = open(directory + '/' + localFilename, 'wb')
for chunk in r.iter_content(chunk_size = 512 * 1024) :
if chunk :
f.write(chunk)
f.flush()
os.fsync(f.fileno())
f.close()
return (time.clock() - start)
def main() :
if len(sys.argv) > 1 :
url = sys.argv[1]
else :
url = raw_input("Enter the URL : ")
directory = raw_input("Where would you want to …Run Code Online (Sandbox Code Playgroud) 我正在使用以下代码来检查平均响应时间,因为我注意到它非常慢:
t1 = time.time()
response = requests.get(url, timeout=10, headers=headers)
t2 = time.time()
reqtimes += t2 - t1
reqamount += 1
print("Average response time:" + str(reqtimes/reqamount))
Run Code Online (Sandbox Code Playgroud)
当我在连接到大约 1000 个不同的站点后打印平均响应时间时,它告诉我平均响应时间为 70 秒。为什么?我的超时设置为 10 !
python ×6
http ×2
printing ×1
progress ×1
python-2.7 ×1
python-3.x ×1
request ×1
stdout ×1
url ×1
urllib ×1