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

为什么Python中没有len(文件)?,python,Python,我对Python并不陌生,但我仍然难以理解是什么让某些东西成为“Pythonic”(反之亦然) 如果这是一个愚蠢的问题,请原谅,但是为什么我不能通过使用len(文件)来获得文件的大小呢 文件。\uuuu len\uuuuu甚至没有实现,所以它不是其他东西所需要的吗?如果它是为了返回文件大小而实现的,是否会因为某种原因而混淆/不一致?文件是一个迭代器。要找到读取整个文件所需的行数 sum(1 for line in file) 如果需要文件中的字节数,请使用os.stat 乙二醇 我会说,因为查

我对Python并不陌生,但我仍然难以理解是什么让某些东西成为“Pythonic”(反之亦然)

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


文件。
\uuuu len\uuuuu
甚至没有实现,所以它不是其他东西所需要的吗?如果它是为了返回文件大小而实现的,是否会因为某种原因而混淆/不一致?

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

sum(1 for line in file)
如果需要文件中的字节数,请使用
os.stat

乙二醇


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

导入操作系统
os.path.getsize('C:\\file.txt')


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

文件
返回一个迭代器,因此不能对其使用
len()

要获取文件的大小,可以使用:

如果“尺寸”指的是行数,请尝试以下方法:

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


sum(1表示uu in open(“abc”))

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

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

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

如果这是一个愚蠢的问题,请原谅我,但是为什么我不能得到答案呢 通过执行len(文件)来调整文件大小

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()
write()
中的一种,仅此而已。

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

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

(1) 在python交互式解释器中执行
导入该
。(2) 因为要实现这一点,您需要将文件读取到其末尾。所以,你最好让操作系统为你做这件事(例如,像in),因为有人提出了OS.stat和statinfo.st_sizeOK,迭代器是有意义的。我想,要为文件实现
\uuu len\uu
,它必须将文件读入内存,然后在缓冲区上执行len()。可能不是个好主意。因此,您可以询问已经知道文件大小的操作系统,即OS.stat。谢谢值得注意的是,在Python3中,与Python2中的
unicode
/
str
区别相比,
str
(一个代码点序列)和
bytes
(一个字节序列)之间的强烈区别使我们更清楚地知道应该如何为每一个字符定义
\ulen\uuuu
。谢谢,这是一个很好的答案。我给@gnibler提供了解决方案,因为他是第一个指出
\uu len\uuu
对文件不起作用的技术原因的人。对于Python 3学习者来说,“193L”并不意味着“193行”,它过去的意思是“193是一个大数字”。我认为我代表“Long”可能是二进制文件的未定义行为:
>>> os.fstat(sys.stdout.fileno()).st_size
0
>>> fd1, fd2 = os.pipe()
>>> os.fstat(fd1).st_size
0
file = open('file.bin', 'r')
# Seek to the end. (0 bytes relative to the end)
file.seek(0, 2)
length = file.tell()