在 Python 中下载之前获取文件的大小 [英] Get size of a file before downloading in Python
问题描述
我正在从 Web 服务器下载整个目录.它工作正常,但我无法弄清楚如何在下载之前获取文件大小以比较它是否在服务器上更新.这可以像我从 FTP 服务器下载文件一样完成吗?
I'm downloading an entire directory from a web server. It works OK, but I can't figure how to get the file size before download to compare if it was updated on the server or not. Can this be done as if I was downloading the file from a FTP server?
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 服务器上的文件大小略小于下载文件的文件大小.
@Jon: thank for your quick answer. It works, but the filesize on the web server is slightly less than the filesize of the downloaded file.
示例:
Local Size Server Size
2.223.533 2.115.516
664.603 662.121
和CR/LF转换有关系吗?
It has anything to do with the CR/LF conversion?
推荐答案
我已经复制了您所看到的内容:
I have reproduced what you are seeing:
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 没有返回正确的大小吗?
What am I doing wrong here? Is os.stat().st_size not returning the correct size?
好的,我想出了问题所在:
OK, I figured out what the problem was:
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
确保您打开两个文件进行二进制读/写.
Make sure you are opening both files for binary read/write.
// open for binary write
open(filename, "wb")
// open for binary read
open(filename, "rb")
这篇关于在 Python 中下载之前获取文件的大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!