Why no len(file) in Python?
我对Python并不完全陌生,但我仍然很难理解是什么让它成为"Python式的"(反之亦然)。
所以,如果这是一个愚蠢的问题,请原谅我,但是为什么我不能通过做一个len(文件)得到一个文件的大小呢?
文件.EDOCX1[0]甚至没有实现,所以它不像是其他东西所需要的?如果实现它以返回文件大小,是否会因为某种原因而混淆/不一致?
文件的定义比您想象的要广泛,尤其是在UNIX中。例如,打印机的长度是多少?还是光盘驱动器?这两者都是/dev中的文件,在Windows中也是类似的。
对于我们通常认为的文件,它的长度是多少?变量的大小?文件的大小(字节)?后者更有意义,但后来变得更糟了。是否应列出文件内容的大小,或其在磁盘上的大小(模数分配单元大小)。对于稀疏文件(具有大的空段,不占用空间,但属于通常报告的文件大小的一部分的文件,由一些文件系统(如ntfs和xfs)支持)来说,问题再次出现。
当然,所有这些问题的答案都可能是,"选择一个并记录下你选择的内容。"也许这正是应该做的,但要成为一个Python,一些东西通常必须是清晰的,而不必阅读大量的文件。
文件是迭代器。要查找需要读取整个文件的行数
1 | sum(1 for line in file) |
如果需要文件中的字节数,请使用
如
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的"一切都是一个文件"的理念,尽管你总是可以使用
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文件对象或类似文件的对象应该表示流,流本身没有长度,特别是如果它们是只写的,比如
通常,对于类似于python文件的对象,唯一可以保证的就是它至少支持
要获得文件大小,可以使用
1 2 3 | >>> foo = os.stat("abc") >>> foo.st_size 193L |
如果按大小表示行数,请尝试以下操作:
1 | len(open("abc").readlines()) |
或
测量字符数的一个简单方法是:
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() |
我会说,因为查找长度取决于操作系统特定的功能。您可以使用以下代码查找文件的长度:
os.path.getsize('C:\\file.txt')
您还可以将整个文件读取到一个字符串中并找到该字符串的长度。但是,您需要确保文件的大小不会占用您的所有内存。