为什么Python中没有len(文件)?

Why no len(file) in Python?

我对Python并不完全陌生,但我仍然很难理解是什么让它成为"Python式的"(反之亦然)。

所以,如果这是一个愚蠢的问题,请原谅我,但是为什么我不能通过做一个len(文件)得到一个文件的大小呢?

文件.EDOCX1[0]甚至没有实现,所以它不像是其他东西所需要的?如果实现它以返回文件大小,是否会因为某种原因而混淆/不一致?


文件的定义比您想象的要广泛,尤其是在UNIX中。例如,打印机的长度是多少?还是光盘驱动器?这两者都是/dev中的文件,在Windows中也是类似的。

对于我们通常认为的文件,它的长度是多少?变量的大小?文件的大小(字节)?后者更有意义,但后来变得更糟了。是否应列出文件内容的大小,或其在磁盘上的大小(模数分配单元大小)。对于稀疏文件(具有大的空段,不占用空间,但属于通常报告的文件大小的一部分的文件,由一些文件系统(如ntfs和xfs)支持)来说,问题再次出现。

当然,所有这些问题的答案都可能是,"选择一个并记录下你选择的内容。"也许这正是应该做的,但要成为一个Python,一些东西通常必须是清晰的,而不必阅读大量的文件。len(string)最明显(可以问字节或字符是返回值),len(array)很明显,len(file)可能不够。


文件是迭代器。要查找需要读取整个文件的行数

1
sum(1 for line in file)

如果需要文件中的字节数,请使用os.stat

1
2
import os
os.stat(filename).st_size


So forgive me if this is a stupid question, but why can't I get the
size of a file by doing a len(file)?

查尔斯·伯恩斯的回答很好地说明了Unix的"一切都是一个文件"的理念,尽管你总是可以使用os.fstat()来获取任何文件描述符的"大小",比如……

1
2
3
4
import os

f = open(anything)
size = os.fstat(f.fileno()).st_size

…它可能不会返回任何有意义或有用的信息…

1
2
3
4
5
>>> os.fstat(sys.stdout.fileno()).st_size
0
>>> fd1, fd2 = os.pipe()
>>> os.fstat(fd1).st_size
0

我认为原因是python文件对象或类似文件的对象应该表示流,流本身没有长度,特别是如果它们是只写的,比如sys.stdout

通常,对于类似于python文件的对象,唯一可以保证的就是它至少支持read()write()中的一个,这就是它。


file返回一个迭代器,因此不能在上面使用len()

要获得文件大小,可以使用os.stat

1
2
3
>>> foo = os.stat("abc")
>>> foo.st_size
193L

如果按大小表示行数,请尝试以下操作:

1
len(open("abc").readlines())

sum (1 for _ in open("abc"))


测量字符数的一个简单方法是:

1
2
3
4
file = open('file.bin', 'r')
# Seek to the end. (0 bytes relative to the end)
file.seek(0, 2)
length = file.tell()


我会说,因为查找长度取决于操作系统特定的功能。您可以使用以下代码查找文件的长度:

import os
os.path.getsize('C:\\file.txt')

您还可以将整个文件读取到一个字符串中并找到该字符串的长度。但是,您需要确保文件的大小不会占用您的所有内存。