23

私はPythonにまったく慣れていませんが、何かを「Pythonic」にするもの(およびその逆)を理解するのにまだ苦労しています。

これがばかげた質問である場合はご容赦ください。しかし、len(file) を実行してもファイルのサイズを取得できないのはなぜですか?

ファイル。__len__実装さえされていないので、他の何かに必要なわけではありませんか? ファイルサイズを返すように実装されている場合、何らかの理由で混乱/矛盾しますか?

4

6 に答える 6

24

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

私たちが通常ファイルとして考えているものについて、その長さはどれくらいでしょうか? 変数の大きさ?ファイルのサイズはバイトですか? 後者の方が理にかなっていますが、そうなるとさらに厄介になります。ファイルの内容のサイズ、またはディスク上のサイズ (モジュラス アロケーション ユニット サイズ) をリストする必要があります。スパース ファイル (スペースを必要としない大きな空のセクションを持つが、ファイルの通常報告されるサイズの一部であり、NTFS や XFS などの一部のファイル システムでサポートされているファイル) についても、問題が生じます。

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

于 2013-05-31T20:30:57.407 に答える
24

ファイルはイテレータです。ファイル全体を読み取るために必要な数を見つけるには

sum(1 for line in file)

ファイル内のバイト数が必要な場合は、使用しますos.stat

例えば

import os
os.stat(filename).st_size
于 2013-05-31T20:26:40.003 に答える
7

fileイテレータを返すため、使用できませんlen()

ファイルのサイズを取得するには、次を使用できますos.stat

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

サイズで行数を意味する場合は、これらを試してください:

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

また

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

于 2013-05-31T20:27:50.380 に答える
5

これがばかげた質問である場合はご容赦ください。しかし、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 のファイルのようなオブジェクトについて保証できる唯一のことは、少なくとも 1 つread()またはをサポートするというwrite()ことだけです。

于 2013-05-31T20:57:55.797 に答える
2

長さを見つけることは、OS固有の機能に依存するためです。次のコードでファイルの長さを確認できます。

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

ファイル全体を文字列に読み取って、文字列の長さを見つけることもできます。ただし、ファイルがすべてのメモリを消費するような巨大なサイズではないことを確認する必要があります。

于 2013-05-31T20:27:25.180 に答える