Python 2.7:仅从文件句柄(而不是路径)获取文件的大小
Posted
技术标签:
【中文标题】Python 2.7:仅从文件句柄(而不是路径)获取文件的大小【英文标题】:Python 2.7: get the size of a file just from its handle (and not its path) 【发布时间】:2015-11-13 00:15:59 【问题描述】:我正在编写一个需要根据文件大小(以字节为单位)对文件执行操作的函数。我想尽量减少传递给函数的参数数量,所以我只会将句柄传递给已经打开的文件,并让函数获取大小。 有没有优雅的方法来做到这一点?
我正在尝试使用os.path.getsize(os.path.abspath(file_id))
,但它不起作用:
def datafile_profiler(file_id):
filesize = os.path.getsize(os.path.abspath(file_id))
#[...] continue doing things with the file, based on the size in bites
return stuff
然后,从“主代码”
file_id = open(filepath, "rb")
stuff = datafile_profiler(file_id)
file_id.close()
欢迎任何建议(也是完全不同的方法)。 谢谢。
【问题讨论】:
【参考方案1】:你可以像这样做一些非常相似的事情:
filesize = os.path.getsize(file_id.name)
这仅适用于使用open()
或类似函数创建并存储本地文件名的file
对象。如果您在某个时候更改了目录,或者另一个进程将文件替换为其他文件,则文件名将不再指向与 file
对象相同的文件。
避免上述问题的另一种获取文件对象大小的方法是:
os.fstat(file_id.fileno()).st_size
【讨论】:
我不得不说,第二种方法确实更健壮,但第一种方法更具可读性(人类):)【参考方案2】:恕我直言,在不使用名称的情况下做你想做的最直接的方法是使用 seek 和 tell。举个例子吧。
def get_file_size(fd):
fd.seek(0,2)
return fd.tell()
fd 是文件描述符。它可能是通过使用 open 甚至是 StringIO 获得的 id。无论哪种方式都可以。
【讨论】:
一个很好的解决方案,尽管您需要保存并恢复当前位置以将其分解为这样的函数,您不能假设当前文件位置可以随便丢弃。我相信(不确定)它在文本模式下打开时可能无法正常工作。 @ShadowRanger,可能需要它,但在这种情况下,只需在搜索之前调用 tell 并保存位置就足够了。 假设文件以二进制模式打开。对于真实文件(具有有效的.fileno()
),如果可用,应使用os.fstat()
。【参考方案3】:
file
对象有一个name
属性,所以你可以这样写:
filesize = os.path.getsize(file_id.name)
【讨论】:
如果您已经有一个打开的文件句柄,Michael Hoffman 的fstat()
解决方案要好得多,原因在该答案中说明。
好点。 @Fabio,感谢您接受我的回答,但您能改成接受迈克尔的回答吗?我觉得比我的好。以上是关于Python 2.7:仅从文件句柄(而不是路径)获取文件的大小的主要内容,如果未能解决你的问题,请参考以下文章
强制 Nosetests 使用 Python 2.7 而不是 3.4
使用 python 2.7 导入 hashlib 而不是 2.6 时出错
如何在 Ubuntu Linux 上将 pymssql 安装到 Python 3.4 而不是 2.7?