2013-05-31 46 views
7

我并不是Python的新手,但我仍然无法理解是什么让“Pythonic”(以及相反)变成了什么东西。为什么Python中没有len(文件)?

所以请原谅我,如果这是一个愚蠢的问题,但为什么我不能做一个LEN(文件),获取文件的大小?

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

+2

(1)在Python解释执行'进口this'。 (2)因为要实现你需要读取文件到最后。所以,你最好让操作系统为你做(例如像[这个问题](http://stackoverflow.com/questions/6591931/getting-file-size-in-python)) – J0HN

+0

因为有人来与os.stat和statinfo.st_size – varun

回答

10

文件是一个迭代器。为了找到你需要阅读整个文件

sum(1 for line in file) 

,如果你想在一个文件中字节线的数量,使用os.stat

import os 
os.stat(filename).st_size 
+0

好吧,迭代器的东西是有道理的。我想为一个文件实现'__len__',它将不得不将文件读入内存,然后在缓冲区中执行len()。可能不是一个好主意。所以你可以询问OS,它已经知道文件的大小,因此os.stat。谢谢! –

2

我会说,因为找到长度取决于操作系统特定的功能。你可以找到一个文件的长度与此代码:

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

你也可以将整个文件读入一个字符串,找到字符串的长度。然而,你会想确保文件的大小不会消耗你所有的内存。

2

file返回迭代器,所以你不能用它len()。如果大小你的意思是线的编号,然后尝试这些

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

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

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

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

+0

文件是一个迭代器,是的,但它有很多方法。 – delnan

+0

'len(open(“abc”).readlines())'非常优雅,谢谢。 – PhysicalChemist

+0

对于Python 3的学习者,“193L”并不意味着“193行”,它的意思是像“193是一个大数字”。 – Noumenon

14

文件有更广泛的定义,特别是在Unix中,你可能会想到。例如,打印机的长度是多少?还是一个CDROM驱动器?两者都是/ dev中的文件,并且在Windows中有所不同。

对于我们通常认为的文件,将其长度是什么呢?变量的大小?文件的大小以字节为单位?后者更有意义,但后来变得更加恶心。应列出文件内容的大小或磁盘上的大小(模数分配单元大小)。对于稀疏文件(具有大量空白部分的文件再次出现问题,这些空白部分不占用空间,但是属于文件正常报告大小的一部分,由NTFS和XFS等文件系统支持)。

当然,回答所有这些可能是,“随便挑一个,并记录你选什么。”也许这正是应该做的,但是为了Pythonic,通常必须清楚地理解,而不必阅读大量文档。 len(string)大多是显而易见的(有人会问,如果字节或字符的返回值),len(array)是显而易见的,len(file)也许不太够。

+2

这是对核心问题的一个很好的检查,+1 – iruvar

+0

值得注意的是,在Python 3中,'str'(一个代码点序列)和'bytes'字节序列)相比于Python 2中的'unicode' /'str'区分更清楚地说明了应该如何定义'__len__'。 – chepner

+0

谢谢,这是一个很好的答案。我刚刚给了@gnibbler解决方案,因为他是第一个指出'__len__'对于一个文件来说效果不好的技术原因。 –

4

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

查尔斯·伯恩斯的回答让有关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()至少一个,那就是它。

1

一个简单的方法来测量的字符数将是:

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