当前位置: 首页 > 面试题库 >

在Python中下载之前获取文件的大小

子车征
2023-03-14
问题内容

我正在从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转换有关系吗?


问题答案:

我转载了您所看到的:

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")


 类似资料:
  • 问题内容: 基本上,我想确定是否应该使用AJAX下载文件,具体取决于文件大小。 我猜这个问题也可以表述为:我如何仅获取ajax请求的标头? 编辑 :评论中的ultima-rat0告诉了我两个已经被问到的显然与这个相同的问题。它们非常相似,但是都需要jQuery。我想要一个非jQuery解决方案。 问题答案: 您可以手动获取XHR响应头数据: http://www.w3.org/TR/XMLHttp

  • 我在两个不同的服务器上使用这个脚本: 这些服务器具有相同的PHP版本和相同的PHP Curl版本。以下是curl结果的两个不同标题: 工作一: HTTP/1.1 302查找日期:2012年6月12日星期二07:04:35 GMT服务器:Apache/2.2.16(Debian)X-Powered-By:PHP/5.3.3-7 squeeze13过期时间:1981年11月19日星期四08:52:00

  • 问题内容: 我编写了一些代码,这些代码将搜索目录并在列表框中显示文件。 我什至尝试过: 我虽然出错了… 好的,它说的Users\Hunter很好,当人们获得我的软件时,名字就没有猎人了。那么,我该如何将其命名为任何用户的下载文件夹? 问题答案: WinAPI方法SHGetKnownFolderPath是检索特殊文件夹(包括个人文件夹和下载文件夹)路径的唯一正确方法。 还有其他方法可以获得相似的结果

  • 问题内容: 我使用了hashlib(在Python 2.6 / 3.0中代替了md5),如果我打开一个文件并将其内容放入函数中,它就可以正常工作。 问题在于非常大的文件,其大小可能超过RAM大小。 如何在不将整个文件加载到内存的情况下获取文件的MD5哈希? 问题答案: 将文件拆分为8192字节的块(或128字节的其他倍数),然后使用连续将其送入MD5 。 这利用了MD5具有128字节摘要块(819

  • 问题内容: 请求是一个非常不错的库。我想用它来下载大文件。问题是不可能将整个文件保留在内存中,我需要分块读取它。这是以下代码的问题 由于某种原因,它无法按这种方式工作。仍将响应加载到内存中,然后再将其保存到文件中。 更新 如果你需要一个小型客户端,可以从FTP下载大文件,则可以在此处找到它。它支持多线程和重新连接(它确实监视连接),还可以为下载任务调整套接字参数。 问题答案: 使用以下流代码,无论

  • cmf_get_file_download_url($file, $expires = 3600) 功能 获取文件下载链接 参数 $file: string 文件路径,数据库里保存的相对路径 $expires: int 过期时间,单位 s 返回 string 文件链接