ฉันกำลังเขียนสคริปต์ Python ใน Windows ฉันต้องการทำบางสิ่งตามขนาดของไฟล์ ตัวอย่างเช่นหากขนาดใหญ่กว่า 0 ฉันจะส่งอีเมลถึงใครบางคนหรือทำอย่างอื่นต่อไป
ฉันจะตรวจสอบขนาดไฟล์ได้อย่างไร
ฉันกำลังเขียนสคริปต์ Python ใน Windows ฉันต้องการทำบางสิ่งตามขนาดของไฟล์ ตัวอย่างเช่นหากขนาดใหญ่กว่า 0 ฉันจะส่งอีเมลถึงใครบางคนหรือทำอย่างอื่นต่อไป
ฉันจะตรวจสอบขนาดไฟล์ได้อย่างไร
คำตอบ:
คุณจำเป็นต้องมีst_size
ทรัพย์สินของวัตถุที่ส่งกลับโดย os.stat
คุณสามารถทำได้โดยใช้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
หรือใช้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
เอาต์พุตอยู่ในหน่วยไบต์
stat_result.st_blocks
ด้วยขนาดบล็อก แต่ฉันยังคงค้นหาวิธีรับโปรแกรมและข้ามแพลตฟอร์ม (ไม่ผ่านtune2fs
ฯลฯ )
การใช้os.path.getsize
:
>>> import os
>>> b = os.path.getsize("/path/isa_005.mp3")
>>> b
2071611
เอาต์พุตอยู่ในหน่วยไบต์
os.path.getsize
เป็นเพียงreturn os.stat(filename).st_size
os.stat
แล้วคุณอาจรวมทั้งได้รับมันทั้งหมดจากสายระบบเดียวผ่าน จากนั้นความแตกต่างอาจมีจำนวน microseconds :-) มากมาย
คำตอบอื่น ๆ ใช้งานได้กับไฟล์จริง แต่ถ้าคุณต้องการบางอย่างที่เหมาะกับ "วัตถุที่คล้ายไฟล์" ลองสิ่งนี้:
# f is a file-like object.
f.seek(0, os.SEEK_END)
size = f.tell()
มันใช้งานได้กับไฟล์จริงและของ StringIO ในการทดสอบที่ จำกัด ของฉัน (Python 2.7.3.) "File เหมือนวัตถุ" API ไม่ได้จริงๆอินเตอร์เฟซที่เข้มงวดของหลักสูตร แต่เอกสาร APIแสดงให้เห็นว่าไฟล์เหมือนวัตถุควรสนับสนุนและseek()
tell()
แก้ไข
ข้อแตกต่างระหว่างสิ่งนี้กับอีกอย่างos.stat()
คือคุณสามารถstat()
ทำไฟล์ได้แม้ว่าคุณจะไม่ได้รับอนุญาตให้อ่านมัน เห็นได้ชัดว่าวิธีการแสวงหา / บอกจะไม่ทำงานจนกว่าคุณจะได้รับอนุญาตให้อ่าน
แก้ไข 2
ตามคำแนะนำของ Jonathon นี่เป็นเวอร์ชั่นหวาดระแวง (รุ่นด้านบนออกจากตัวชี้ไฟล์ที่ท้ายไฟล์ดังนั้นหากคุณพยายามที่จะอ่านจากไฟล์คุณจะได้ 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)
os
แทนที่จะเขียนf.seek(0, 2)
เพื่อค้นหา 0 ไบต์จากจุดสิ้นสุด
os
ไม่ได้ใช้:f.seek(old_file_position, 0)
os
ไม่มีเหตุผลที่น่าสนใจไม่ได้ที่จะนำเข้า
size
เอาท์พุทเป็นไบต์?
#seek()
: wiki.sei.cmu.edu/confluence/display/c/…
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
return f'{num:.1f} {x}'
Python> = 3.5
การใช้pathlib
( เพิ่มใน Python 3.4หรือ backport ที่มีในPyPI ):
from pathlib import Path
file = Path() / 'doc.txt' # or Path('./doc.txt')
size = file.stat().st_size
นี่เป็นเพียงอินเทอร์เฟซรอบ ๆos.stat
แต่การใช้pathlib
ให้วิธีที่ง่ายในการเข้าถึงการดำเนินการอื่น ๆ ที่เกี่ยวข้องกับไฟล์
มี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)
การยึดติดกับคำถามอย่างเคร่งครัดรหัส Python (+ pseudo-code) จะเป็น:
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 ....
เรามีสองตัวเลือกทั้งสองรวมถึงการนำเข้าโมดูลระบบปฏิบัติการ
1) นำเข้าระบบปฏิบัติการเป็น os.stat () ฟังก์ชั่นส่งคืนวัตถุที่มีส่วนหัวจำนวนมากรวมถึงเวลาที่สร้างไฟล์และเวลาที่แก้ไขล่าสุด ฯลฯ ในหมู่พวกเขา st_size () ให้ขนาดที่แน่นอนของไฟล์
os.stat ( "ชื่อไฟล์"). st_size ()
2) การนำเข้าระบบปฏิบัติการในสิ่งนี้เราจะต้องให้เส้นทางไฟล์ที่แน่นอน (เส้นทางที่แน่นอน) ไม่ใช่เส้นทางสัมพัทธ์
os.path.getsize ("เส้นทางของไฟล์")
Path('./doc.txt').stat().st_size