Tôi đang viết một kịch bản 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 những việc khác.
Làm cách nào để kiểm tra kích thước tệp?
Tôi đang viết một kịch bản 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 những việc khác.
Làm cách nào để kiểm tra kích thước tệp?
Câu trả lời:
Bạn cần st_size
tài sản của đối tượng trả vềos.stat
. Bạn có thể lấy nó bằng cách sử dụng pathlib
(Python 3.4+):
>>> 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
hoặc sử dụng 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
Đầu ra được tính bằng byte.
stat_result.st_blocks
với kích thước khối, nhưng tôi vẫn đang tìm cách lấy nó theo lập trình và đa nền tảng (không thông qua tune2fs
v.v.)
Sử dụng os.path.getsize
:
>>> import os
>>> b = os.path.getsize("/path/isa_005.mp3")
>>> b
2071611
Đầu ra được tính bằng byte.
os.path.getsize
chỉ đơn giản làreturn os.stat(filename).st_size
os.stat
. Sau đó, sự khác biệt có thể xảy ra với số lượng đáng kể micro giây :-)
Các câu trả lời khác hoạt động cho các tệp thực, nhưng nếu bạn cần một cái gì đó hoạt động cho "các đối tượng giống như tệp", hãy thử điều 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 thực và StringIO, trong thử nghiệm giới hạn của tôi. (Python 2.7.3.) Tất nhiên, API "đối tượng giống như tệp" không thực sự là một giao diện nghiêm ngặt, nhưng tài liệu API cho thấy các đối tượng giống như tệp nên hỗ trợ seek()
và tell()
.
Biên tập
Một điểm khác biệt giữa điều này và os.stat()
là bạn có thể tạo stat()
một tập tin ngay cả khi bạn không có quyền đọc nó. Rõ ràng phương pháp tìm kiếm / nói sẽ không hiệu quả trừ khi bạn có quyền đọc.
Chỉnh sửa 2
Theo đề nghị của Jonathon, đây là phiên bản hoang tưởng. (Phiên bản ở trên để lại con trỏ tệp ở cuối tệp, vì vậy nếu bạn cố đọc từ tệp, bạn sẽ nhận được 0 byte trở lại!)
# 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)
os
, thay vào đó hãy viết f.seek(0, 2)
để tìm kiếm 0 byte từ cuối.
os
không được sử dụng:f.seek(old_file_position, 0)
os
.
size
đầu ra là byte?
#seek()
: wiki.sei.cmu.edu/confluence/display/c/iêu
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
this function will convert bytes to MB.... GB... etc
Sai lầm. Hàm này sẽ chuyển đổi byte thành MiB, GiB, v.v ... Xem bài đăng này .
return f'{num:.1f} {x}'
Python> = 3.5.
Sử dụng pathlib
( được thêm vào Python 3.4 hoặc backport 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 việc 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.
Có một bitshift
mẹo tôi sử dụng nếu tôi muốn chuyển đổi từ bytes
bất kỳ đơn vị nào khác. Nếu bạn thực hiện một ca đúng bởi 10
bạn về cơ bản thay đổi nó theo một đơn đặt hàng (nhiều).
Thí dụ:
5GB are 5368709120 bytes
print (5368709120 >> 10) # 5242880 kilobytes (kB)
print (5368709120 >> 20 ) # 5120 megabytes (MB)
print (5368709120 >> 30 ) # 5 gigabytes (GB)
Bám sát vào câu hỏi, mã Python (+ mã giả) 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>
#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 ....
chúng tôi có hai tùy chọn Cả hai bao gồm nhập mô-đun os
1) nhập hàm os dưới dạng os.stat () trả về một đối tượng chứa rất nhiều tiêu đề bao gồm thời gian tạo tệp và thời gian sửa đổi lần cuối, v.v. trong số đó st_size () đưa ra kích thước chính xác của tệp.
os.stat ("tên tệp"). st_size ()
2) nhập os Trong trường hợp này, chúng tôi phải cung cấp đường dẫn tệp chính xác (đường dẫn tuyệt đối), không phải là đường dẫn tương đối.
os.path.getsize ("đường dẫn của tệp")
Path('./doc.txt').stat().st_size