我对 Python 并不完全陌生,但我仍然很难理解是什么使某些东西“Pythonic”(反之亦然)。
如果这是一个愚蠢的问题,请原谅我,但为什么我不能通过执行 len(file) 来获得文件的大小?
文件。__len__
甚至没有实现,所以它不像其他东西需要它?如果实现它以返回文件大小,是否会因某种原因而令人困惑/不一致?
我对 Python 并不完全陌生,但我仍然很难理解是什么使某些东西“Pythonic”(反之亦然)。
如果这是一个愚蠢的问题,请原谅我,但为什么我不能通过执行 len(file) 来获得文件的大小?
文件。__len__
甚至没有实现,所以它不像其他东西需要它?如果实现它以返回文件大小,是否会因某种原因而令人困惑/不一致?
file 是一个迭代器。要查找需要读取整个文件的行数
sum(1 for line in file)
如果您想要文件中的字节数,请使用os.stat
例如
import os
os.stat(filename).st_size
文件的定义比您想象的要广泛,尤其是在 Unix 中。例如,打印机的长度是多少?还是光驱?两者都是 /dev 中的文件,有点像 Windows 中的文件。
对于我们通常认为的文件,它的长度是多少?变量的大小?文件的大小(以字节为单位)?后者更有意义,但随后变得更加棘手。应该列出文件内容的大小,还是它在磁盘上的大小(模数分配单元大小)。稀疏文件(具有不占用空间的大空部分的文件,但属于文件通常报告的大小的一部分,由某些文件系统(如 NTFS 和 XFS)支持)再次出现问题。
当然,所有这些问题的答案都可能是“只需选择一个并记录您选择的内容”。也许这正是应该做的,但要成为 Pythonic,通常必须明确一些东西,而不必阅读大量文档。len(string)
很明显(有人可能会问返回值是字节还是字符),len(array)
很明显,len(file)
可能还不够。
file
返回一个迭代器,所以你不能len()
在它上面使用。
要获取文件的大小,您可以使用os.stat
:
>>> foo = os.stat("abc")
>>> foo.st_size
193L
如果按大小表示行数,请尝试以下操作:
len(open("abc").readlines())
或者
sum (1 for _ in open("abc"))
如果这是一个愚蠢的问题,请原谅我,但为什么我不能通过执行 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()
,仅此而已。
测量字符数的一种简单方法是:
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')
您还可以将整个文件读入字符串并找到字符串的长度。但是,您需要确保该文件的大小不会占用您所有的内存。