在Python中下载之前获取文件的大小
时间:2020-03-05 18:38:36 来源:igfitidea点击:
我正在从Web服务器下载整个目录。它可以正常工作,但是我无法弄清楚如何在下载之前获取文件大小以进行比较(如果服务器上是否已对其进行了更新)。可以像从FTP服务器下载文件一样完成此操作吗?
import urllib import re url = "http://www.someurl.com" # Download the page locally f = urllib.urlopen(url) html = f.read() f.close() f = open ("temp.htm", "w") f.write (html) f.close() # List only the .TXT / .ZIP files fnames = re.findall('^.*<a href="(\w+(?:\.txt|.zip)?)".*$', html, re.MULTILINE) for fname in fnames: print fname, "..." f = urllib.urlopen(url + "/" + fname) #### Here I want to check the filesize to download or not #### file = f.read() f.close() f = open (fname, "w") f.write (file) f.close()
@Jon:感谢快速回答。它可以工作,但是Web服务器上的文件大小略小于下载文件的文件大小。
例子:
Local Size Server Size 2.223.533 2.115.516 664.603 662.121
与CR / LF转换有关系吗?
解决方案
回答
文件的大小作为Content-Length标头发送。这是使用urllib获取它的方法:
>>> site = urllib.urlopen("http://python.org") >>> meta = site.info() >>> print meta.getheaders("Content-Length") ['16535'] >>>
回答
使用返回的urllib对象方法info()
,我们可以获得有关已检索文档的各种信息。抓取当前Google徽标的示例:
>>> import urllib >>> d = urllib.urlopen("http://www.google.co.uk/logos/olympics08_opening.gif") >>> print d.info() Content-Type: image/gif Last-Modified: Thu, 07 Aug 2008 16:20:19 GMT Expires: Sun, 17 Jan 2038 19:14:07 GMT Cache-Control: public Date: Fri, 08 Aug 2008 13:40:41 GMT Server: gws Content-Length: 20172 Connection: Close
这是一个决定,因此,要获取文件的大小,请执行urllibobject.info()['Content-Length']`
print f.info()['Content-Length']
要获取本地文件的大小(用于比较),可以使用os.stat()命令:
os.stat("/the/local/file.zip").st_size
回答
另外,如果我们要连接的服务器支持它,请查看Etags以及If-Modified-Since和If-None-Match标头。
使用这些将利用Web服务器的缓存规则,如果内容未更改,则将返回304未修改状态代码。
回答
我转载了我们所看到的:
import urllib, os link = "http://python.org" print "opening url:", link site = urllib.urlopen(link) meta = site.info() print "Content-Length:", meta.getheaders("Content-Length")[0] f = open("out.txt", "r") print "File on disk:",len(f.read()) f.close() f = open("out.txt", "w") f.write(site.read()) site.close() f.close() f = open("out.txt", "r") print "File on disk after download:",len(f.read()) f.close() print "os.stat().st_size returns:", os.stat("out.txt").st_size
输出此:
opening url: http://python.org Content-Length: 16535 File on disk: 16535 File on disk after download: 16535 os.stat().st_size returns: 16861
我在这里做错了什么? os.stat()。st_size是否没有返回正确的大小?
编辑:
好的,我找出了问题所在:
import urllib, os link = "http://python.org" print "opening url:", link site = urllib.urlopen(link) meta = site.info() print "Content-Length:", meta.getheaders("Content-Length")[0] f = open("out.txt", "rb") print "File on disk:",len(f.read()) f.close() f = open("out.txt", "wb") f.write(site.read()) site.close() f.close() f = open("out.txt", "rb") print "File on disk after download:",len(f.read()) f.close() print "os.stat().st_size returns:", os.stat("out.txt").st_size
输出:
$ python test.py opening url: http://python.org Content-Length: 16535 File on disk: 16535 File on disk after download: 16535 os.stat().st_size returns: 16535
确保打开两个文件以进行二进制读/写。
// open for binary write open(filename, "wb") // open for binary read open(filename, "rb")