在使用文件对象之前确定文件对象大小
我正在尝试在用Python下载文件后,确定这个文件的大小,然后再用BeautifulSoup来解析和处理它。(我打算很快更新到ElementTree,但我简单试过后发现,它并不能解决我在这里提出的问题,至少我目前是这样认为的。)
import urllib2, BeautifulSoup
query = 'http://myexample.file.com/file.xml'
f = urllib2.urlopen(query)
print len(f.read())
soup = BeautifulSoup.BeautifulStoneSoup(f.read())
这段代码出问题了,因为当我第一次用len()
来read()
这个文件时,它自然会读到文件的末尾(EOF),所以当我想用BeautifulSoup访问它时,文件对象已经是空的了。
我最初的想法是简单地用fcopy = f
来复制这个对象,但这让我明白我只是引用了底层对象,并没有得到任何实际的副本。
接着我想,fcopy = copy.copy(f)
应该可以创建一个真正的对象副本,但显然并没有,因为读取f时,fcopy仍然是一个空的文件对象。
我甚至读到过关于将对象作为参数传递给函数的方法,以此来解决这个问题,并尝试了以下代码
import urllib2, BeautifulSoup
def get_bytes(file):
return len(file.read())
query = 'http://myexample.file.com/file.xml'
f = urllib2.urlopen(query)
print(get_bytes(f))
soup = BeautifulSoup.BeautifulStoneSoup(f.read())
但我遇到了同样的问题。我该如何在不破坏文件的情况下,确定这个对象的文件大小呢?
1 个回答
2
把文件里的内容复制到一个变量里,然后就可以对这个变量进行操作了:
import urllib2, BeautifulSoup
query = 'http://myexample.file.com/file.xml'
f = urllib2.urlopen(query)
content = f.read()
print len(content)
soup = BeautifulSoup.BeautifulStoneSoup(content)