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?

Python 2.7 函数是不是记住值而不是引用?关闭怪异

如何在 Python 3.4 而不是 2.7 中安装 requests 模块

获取时间戳而不是日期时间对象,sqlalchemy python 2.7