2010-01-20 27 views
486

Tôi đang viết một tập lệnh Python trong Windows. Tôi muốn làm một cái gì đó dựa trên kích thước tập tin. Ví dụ, nếu kích thước lớn hơn 0, tôi sẽ gửi email cho ai đó, nếu không thì tiếp tục với những thứ khác.Cách kiểm tra kích thước tệp trong python?

Làm cách nào để kiểm tra kích thước tệp?

Trả lời

464

Sử dụng os.stat, và sử dụng st_size thành viên của đối tượng kết quả:

>>> import os 
>>> statinfo = os.stat('somefile.txt') 
>>> statinfo 
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732) 
>>> statinfo.st_size 
926L 

Output là tính bằng byte.

+13

Đây có phải là byte không? Hoặc bit? –

+59

Điều này là theo byte –

+24

@HaikalNashuha Tôi biết không có hệ thống tệp nào cho phép các tệp phân đoạn byte –

754

Như thế này (tín dụng http://www.daniweb.com/forums/thread78629.html):

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

Đầu ra là tính theo byte.

+82

Lưu ý: việc thực hiện của 'os.path.getsize' chỉ đơn giản là 'trở lại os.stat (filename) .st_size' – wim

+172

Nhưng, oh, làm thế nào rõ ràng hơn nhiều hơn 'st_size'! –

+0

Vì vậy, có một mất hiệu suất phút từ việc sử dụng os.path.getsize như trái ngược với os.stat (file) .st_size? – wordsforthewise

93

Những câu trả lời khác làm việc cho các tập tin thực, nhưng nếu bạn cần một cái gì đó mà làm việc cho "các đối tượng tập tin giống như", hãy thử này:

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

Nó hoạt động cho các tập tin thực tế và StringIO, trong thử nghiệm hạn chế của tôi. (Python 2.7.3.) API "đối tượng tập tin" không thực sự là một giao diện nghiêm ngặt, tất nhiên, nhưng API documentation gợi ý rằng các đối tượng giống như tệp phải hỗ trợ seek()tell().

Sửa

Một điểm khác biệt giữa điều này và os.stat() là bạn có thể stat() một tập tin ngay cả khi bạn không có quyền để đọc nó. Rõ ràng cách tiếp cận tìm kiếm/nói sẽ không hoạt động trừ khi bạn có quyền đọc.

Chỉnh sửa 2

Theo gợi ý của Jonathon của, đây là một phiên bản hoang tưởng. (Phiên bản trên lá con trỏ tập tin ở phần cuối của tập tin, vì vậy nếu bạn đã cố gắng đọc từ tập tin, bạn sẽ nhận được zero byte trở lại!)

+5

Bạn không cần phải nhập 'os', thay vì viết' f.seek (0, 2) 'để tìm 0 byte từ đầu. – cdosborn

+2

Và đối với dòng cuối cùng, nếu '' 'os''' không được sử dụng:' '' f.seek (old_file_position, 0) '' ' – luckydonald

+23

Nếu bạn sử dụng chữ số nguyên thay vì các biến có tên, bạn đang tra tấn bất kỳ ai phải duy trì mã của bạn. Không có lý do thuyết phục nào để không nhập 'os'. –

31
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) 

Kết quả:

6.1 MB 
+1

câu trả lời của bạn sẽ giúp tôi rất nhiều .. –

+2

'chức năng này sẽ chuyển đổi byte thành MB .... GB ... v.v. Sai. Hàm này sẽ chuyển đổi byte thành MiB, GiB, v.v. Xem [bài đăng này] (https://superuser.com/a/1077275/174299). – moi

9

Sử dụng pathlib (added in Python 3.4 và có sẵn trên PyPI) ...

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

Đây thực sự chỉ là một giao diện xung quanh os.stat, nhưng sử dụng pathlib cung cấp một cách dễ dàng để truy cập các hoạt động liên quan đến tệp khác.

3

nghiêm gắn bó với câu hỏi, mã python (+ pseudo-code) sẽ là:

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> 
3

Có một trick bitshift tôi sử dụng nếu tôi muốn để chuyển đổi từ bytes cho bất kỳ đơn vị khác. Nếu bạn thực hiện một sự thay đổi phù hợp bằng cách 10 bạn về cơ bản thay đổi nó theo một thứ tự (nhiều).

Ví dụ: 5GB are 5368709120 bytes

print (5368709120 >> 10) # 5242880 kilo Bytes (kB) 
print (5368709120 >> 20) # 5120 Mega Bytes(MB) 
print (5368709120 >> 30) # 5 Giga Bytes(GB) 
Các vấn đề liên quan