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:仅从文件句柄(而不是路径)获取文件的大小的主要内容,如果未能解决你的问题,请参考以下文章