23

我对 Python 并不完全陌生,但我仍然很难理解是什么使某些东西“Pythonic”(反之亦然)。

如果这是一个愚蠢的问题,请原谅我,但为什么我不能通过执行 len(file) 来获得文件的大小?

文件。__len__甚至没有实现,所以它不像其他东西需要它?如果实现它以返回文件大小,是否会因某种原因而令人困惑/不一致?

4

6 回答 6

24

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

sum(1 for line in file)

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

例如

import os
os.stat(filename).st_size
于 2013-05-31T20:26:40.003 回答
24

文件的定义比您想象的要广泛,尤其是在 Unix 中。例如,打印机的长度是多少?还是光驱?两者都是 /dev 中的文件,有点像 Windows 中的文件。

对于我们通常认为的文件,它的长度是多少?变量的大小?文件的大小(以字节为单位)?后者更有意义,但随后变得更加棘手。应该列出文件内容的大小,还是它在磁盘上的大小(模数分配单元大小)。稀疏文件(具有不占用空间的大空部分的文件,但属于文件通常报告的大小的一部分,由某些文件系统(如 NTFS 和 XFS)支持)再次出现问题。

当然,所有这些问题的答案都可能是“只需选择一个并记录您选择的内容”。也许这正是应该做的,但要成为 Pythonic,通常必须明确一些东西,而不必阅读大量文档。len(string)很明显(有人可能会问返回值是字节还是字符),len(array)很明显,len(file)可能还不够。

于 2013-05-31T20:30:57.407 回答
7

file返回一个迭代器,所以你不能len()在它上面使用。

要获取文件的大小,您可以使用os.stat

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

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

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

或者

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

于 2013-05-31T20:27:50.380 回答
5

如果这是一个愚蠢的问题,请原谅我,但为什么我不能通过执行 len(file) 来获得文件的大小?

Charles Burns 的回答很好地说明了 Unix 的“一切都是文件”的理念,尽管您总是可以使用os.fstat()来获取任何文件描述符的“大小”,例如......

import os

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

...它可能不会返回任何有意义或有用的东西...

>>> os.fstat(sys.stdout.fileno()).st_size
0
>>> fd1, fd2 = os.pipe()
>>> os.fstat(fd1).st_size
0

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

通常,对于 Python 类文件对象,您唯一可以保证的是它至少支持read()or之一write(),仅此而已。

于 2013-05-31T20:57:55.797 回答
3

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

file = open('file.bin', 'r')
# Seek to the end. (0 bytes relative to the end)
file.seek(0, 2)
length = file.tell()
于 2013-05-31T20:59:23.757 回答
2

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

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

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

于 2013-05-31T20:27:25.180 回答