2013-05-31 15 views
7

私はPythonを初めて新しくするわけではありませんが、何か "Pythonic"(とその逆)を作るのを理解するのは難しいです。なぜPythonでlen(file)を使用しないのですか?

これは愚かな質問だと私を許しますが、なぜlen(ファイル)を実行してファイルのサイズを取得できないのですか?

ファイル。 __len__は実装されていないため、別のものに必要なようではありませんか?ファイルサイズを返すように実装されていれば、何らかの理由で混乱したり矛盾したりするのでしょうか?

+2

(1)Pythonでインタラクティブインタプリタは 'インポートthis'を実行します。 (2)それを実装するためには、ファイルを読み終える必要があります。だから、OSにあなたのためにそれをするように頼むほうがいいでしょう(例えば、[このような質問](0120)) – 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

OK、イテレーターのことは意味があります。ファイルをメモリに読み込み、バッファ上でlen()を実行する必要があるファイルに対して '__len__'を実装すると思います。おそらくいい考えではないでしょう。したがって、OSに問い合わせることができます。これはすでにファイルサイズを知っています。従ってos.statです。ありがとう! –

2

Iを使用長さを見つけることは、OS固有の機能に依存するので、言うでしょう。あなたは、このコードでファイルの長さを見つけることができます:あなたはまた、文字列にファイル全体を読み込み、文字列の長さを見つけることができる

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

。しかし、ファイルがすべてのあなたの記憶を食べる巨大なサイズではないことを確かめたいと思うでしょう。

2

fileはイテレータを返しますので、len()は使用できません。

あなたがos.statを使用することができ、ファイルのサイズを取得するには、次の

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

あなたが行の数を意味するサイズであれば、これらを試してみてください。

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

または

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

+0

ファイルはイテレータですが、多くの方法があります。 – delnan

+0

'len(open(" abc ")。readlines())'はとてもエレガントです。ありがとうございます。 – PhysicalChemist

+0

Python 3の学習者にとって、「193L」は「193行」を意味するものではなく、「193は大数」という意味です。 – Noumenon

14

ファイルには、より広い定義があります。特にあなたが考えるかもしれないよりも、Unixでは。たとえば、プリンターの長さは?またはCDROMドライブ?どちらも/ devにあるファイルとWindowsで並べ替えられています。

私たちが通常ファイルと考えるものについては、その長さはどのくらいでしょうか?変数のサイズは?バイト単位のファイルのサイズ?後者はもっと理にかなっていますが、それはより奇妙になります。ファイルの内容のサイズ、またはディスク上のサイズ(モジュラスアロケーションユニットサイズ)を表示する必要があります。疎なファイル(空き領域がなく、通常はNTFSやXFSなどのファイルシステムでサポートされているファイルのサイズの一部であるファイル)については、もう一度問題が発生します。

もちろん、これらすべての回答は、「1つを選択して、あなたが選んだものを文書化する」ことができます。おそらくそれはまさに実行すべきものですが、Pythonicであるためには、多くのドキュメントを読まなくても何かをクリアする必要があります。 len(string)はほとんど明らかです(バイトまたは文字が戻り値であるかどうか尋ねるかもしれません)。len(array)が明らかです。len(file)で十分ではないかもしれません。

+2

これは核心の問題をよく調べたものです。+1 – iruvar

+0

Python 3では、 'str'(コードポイントのシーケンス)と' bytes' Python 2の 'unicode' /' str'の区別と比較して、それぞれに '__len__'をどのように定義すべきかを明確にしています。 – chepner

+0

ありがとう、これは素晴らしい答えです。なぜなら、 '__len__'がファイルに対してうまく動作しないという技術的な理由を最初に指摘したのは、@gnibblerへの解決策でした。 –

4

これは愚かな質問だと私に許してもらえますが、なぜlen(ファイル)を使ってファイルのサイズを にすることができませんか?何かで、任意のファイルディスクリプタのためのサイズ 『

チャールズ・バーンズ...

LIKEあなたは常に取得する os.fstat()を使用することができますが、その答えは、Unixのの『すべてのファイルがある』哲学についての良い点を作る、と』それは意味のあるまたは有用な何も返さないことがあり
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()の1またはwrite()をサポートすることであることができ、そしてそれはそれについてです。文字の数を測定する

1

簡単な方法は次のようになります

file = open('file.bin', 'r') 
# Seek to the end. (0 bytes relative to the end) 
file.seek(0, 2) 
length = file.tell() 
関連する問題