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