Pythonでファイルサイズを確認するにはどうすればよいですか?


757

WindowsでPythonスクリプトを書いています。ファイルサイズに基づいて何かしたい。たとえば、サイズが0より大きい場合は、誰かにメールを送信します。それ以外の場合は続行します。

ファイルサイズを確認するにはどうすればよいですか?


2
Path('./doc.txt').stat().st_size
ボリス

最新のPython(v3.4 +)の回答を@Borisに感謝します:)
mab

回答:


735

によって返されるオブジェクトst_sizeプロパティが必要です。(Python 3.4以降)を使用して取得できます。os.statpathlib

>>> from pathlib import Path
>>> Path('somefile.txt').stat()
os.stat_result(st_mode=33188, st_ino=6419862, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=1564, st_atime=1584299303, st_mtime=1584299400, st_ctime=1584299400)
>>> Path('somefile.txt').stat().st_size
1564

または使用os.stat

>>> import os
>>> os.stat('somefile.txt')
os.stat_result(st_mode=33188, st_ino=6419862, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=1564, st_atime=1584299303, st_mtime=1584299400, st_ctime=1584299400)
>>> os.stat('somefile.txt').st_size
1564

出力はバイト単位です。


2
どちらかといえば、値はファイルシステムのブロックサイズの倍数として渡される可能性があります(たとえば、4096バイト)。嬉しいことに、代わりにバイトとして与えられます。
josch

1
@josch-はい、これはいいことです。「ディスク上のサイズ」の場合stat_result.st_blocks、ブロックサイズを掛けることができますが、プログラムやクロスプラットフォームで(tune2fs
たとえば、

1098

使用os.path.getsize

>>> import os
>>> b = os.path.getsize("/path/isa_005.mp3")
>>> b
2071611

出力はバイト単位です。


124
注:の実装os.path.getsizeは単純ですreturn os.stat(filename).st_size
wim 2013年

os.stat(file).st_sizeとは対照的に、os.path.getsizeを使用すると、わずかなパフォーマンスの低下がありますか?
ワードワード、2015年

5
@wordsforthewiseそれを測定!私のコンピュータでは約150 ns。
Davidmh

@wordsforthewiseこれは、ファイルに関する他の事柄(変更時間、ファイルのタイプなど)も取得したい場合は、さらに問題になります。-を介した単一のシステムコールからすべて取得することもできますos.stat。次に、その差はかなりの数のマイクロ秒になる可能性があります:-)
greggo

ファイルが作成された直後に呼び出された場合、0を返します@danben
alper

131

他の答えは実際のファイルで機能しますが、「ファイルのようなオブジェクト」で機能するものが必要な場合は、これを試してください:

# f is a file-like object. 
f.seek(0, os.SEEK_END)
size = f.tell()

私の限られたテストでは、実際のファイルとStringIOで動作します。(Pythonの2.7.3。)「オブジェクトファイルのような」APIはもちろん、実際には厳格なインタフェースではなく、APIのドキュメントでは、ファイルのようなオブジェクトがサポートしなければならないことを示唆しているseek()tell()

編集する

これとのもう1つの違いos.stat()stat()、ファイルを読み取る権限がなくてもファイルを作成できることです。当然のことながら、ユーザーが読み取り権限を持っていない限り、シーク/テルアプローチは機能しません。

編集2

ジョナソンの提案で、これは偏執的なバージョンです。(上記のバージョンでは、ファイルポインターがファイルの末尾に残っているため、ファイルから読み取ろうとすると、0バイトが返されます。)

# f is a file-like object. 
old_file_position = f.tell()
f.seek(0, os.SEEK_END)
size = f.tell()
f.seek(old_file_position, os.SEEK_SET)

8
インポートする必要はありませんos。代わりにf.seek(0, 2)、最後から0バイトをシークするために書き込みます。
cdosborn 2015

2
そして、最後の行についてosは、使用されない場合:f.seek(old_file_position, 0)
luckydonald

48
名前付き変数の代わりに整数リテラルを使用する場合、コードを保守する必要がある人を拷問しています。インポートしない理由はありませんos
Mark E. Haase

解決策をありがとう、私は実装しました、そしてそれはうまくいきます。確認のために、size出力はバイト単位ですか?
Kedar.Aitawdekar

3
どうやらこれは、どのようにPythonの実装に応じて、少なくとも少し危険です#seek()wiki.sei.cmu.edu/confluence/display/c/...
Autumnsault

72
import os


def convert_bytes(num):
    """
    this function will convert bytes to MB.... GB... etc
    """
    for x in ['bytes', 'KB', 'MB', 'GB', 'TB']:
        if num < 1024.0:
            return "%3.1f %s" % (num, x)
        num /= 1024.0


def file_size(file_path):
    """
    this function will return the file size
    """
    if os.path.isfile(file_path):
        file_info = os.stat(file_path)
        return convert_bytes(file_info.st_size)


# Lets check the file size of MS Paint exe 
# or you can use any file path
file_path = r"C:\Windows\System32\mspaint.exe"
print file_size(file_path)

結果:

6.1 MB

5
this function will convert bytes to MB.... GB... etc違う。この関数は、バイトをMiB、GiBなどに変換します。この投稿を参照してください。
moi 2017

2
行10はreturn f'{num:.1f} {x}'Python> = 3.5に変更できます。
Matt M.

53

使用pathlibPython 3.4で追加されたか、PyPIで利用可能なバックポート):

from pathlib import Path
file = Path() / 'doc.txt'  # or Path('./doc.txt')
size = file.stat().st_size

これは実際にはのインターフェースにすぎませんos.statが、を使用pathlibすると、他のファイル関連の操作に簡単にアクセスできます。


18

他のユニットbitshiftに変換したい場合に使うトリックがありbytesます。右シフトを行う場合は、10基本的に順序(複数)でシフトします。

例: 5GB are 5368709120 bytes

print (5368709120 >> 10)  # 5242880 kilobytes (kB)
print (5368709120 >> 20 ) # 5120 megabytes (MB)
print (5368709120 >> 30 ) # 5 gigabytes (GB)

9
これは質問の答えにはなりません。問題は、ファイルのサイズを見つけることであり、人間が使用できるように結果をフォーマットすることではありません。
マンリー、

1
これらの数値は間違っているため、混乱を招きます。5GBは5e9バイトです。これは、ある種の人間が読める近似であるはずですか?このようなものをどこで使用しますか?
Dre

1ビット=> 2 ... 2ビット=> 4 ... 3ビット=> 8 ... 4ビット=> 16 ... 5ビット=> 32 ... 6ビット=> 64 ... 7ビット=> 128 ... 8ビット=> 256 ... 9ビット=> 512 ... 10ビット=> 1024 ... 1024バイトは1kB ... => 20 -bits => 1024 * 1024 = 1,048,576bytes、つまり1024kB、および1MB ... => 30ビット=> 1024 * 1024 * 1024 = 1,073,741,824バイト、つまり1,048,576 kB、および1024MB、そして1GB…混乱しています計算で使用される2進数/ 2進数表現の科学表記と小数点以下の桁数。5x9 = 5 x 10 ^ 9 = 5,000,000,000
James 'Fluffy' Burton

3
みんな、彼は何も混乱していません...彼は「基本的に」言ったときに明白である近似を与えられました。2 ^ 10は約です。10 ^ 3。実際には、この近似はほど一般的である、それは名前があるMebiGibiを、そしてTebiは、それぞれ、メガ、ギガ、テラとしています。@WillManleyの質問に答えないことに関して、あなたはそこに公平な点があります!;-p
マイクウィリアムソン

9

厳密に質問に固執すると、Pythonコード(+疑似コード)は次のようになります。

import os
file_path = r"<path to your file>"
if os.stat(file_path).st_size > 0:
    <send an email to somebody>
else:
    <continue to other things>

-1
#Get file size , print it , process it...
#Os.stat will provide the file size in (.st_size) property. 
#The file size will be shown in bytes.

import os

fsize=os.stat('filepath')
print('size:' + fsize.st_size.__str__())

#check if the file size is less than 10 MB

if fsize.st_size < 10000000:
    process it ....

-1

2つのオプションがあります。どちらもosモジュールのインポートを含みます。

1)os.stat()関数としてosをインポートすると、ファイルの作成時刻や最終更新時刻など、非常に多くのヘッダーを含むオブジェクトが返されます。st_size()は、ファイルの正確なサイズを示します。

os.stat( "filename")。st_size()

2)import osこの場合、相対パスではなく、正確なファイルパス(絶対パス)を指定する必要があります。

os.path.getsize( "ファイルのパス")

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.