Я пишу сценарий 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
. Тогда разница может составить значительное количество микросекунд :-)
Другие ответы работают для реальных файлов, но если вам нужно что-то, что работает для «файловых объектов», попробуйте это:
# f is a file-like object.
f.seek(0, os.SEEK_END)
size = f.tell()
Это работает для реальных файлов и StringIO, в моем ограниченном тестировании. (Python 2.7.3.) API "file-like object", конечно, не совсем строгий интерфейс, но документация API предполагает, что file-like объекты должны поддерживать seek()
и tell()
.
редактировать
Еще одно различие между этим и тем os.stat()
, что вы можете stat()
файл, даже если у вас нет разрешения на его чтение. Очевидно, что подход поиска / сообщения не будет работать, если у вас нет разрешения на чтение.
Редактировать 2
По предложению Джонатона, вот параноидальная версия. (Приведенная выше версия оставляет указатель файла в конце файла, поэтому, если вы попытаетесь прочитать файл, вы получите ноль байтов назад!)
# 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 или бэкпорт доступен на 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 (+ псевдокод) будет:
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) import os как функция os.stat () возвращает объект, который содержит так много заголовков, включая время создания файла, время последнего изменения и т. Д. Среди них st_size () дает точный размер файла.
os.stat ( "имя_файла"). st_size ()
2) import os Здесь мы должны указать точный путь к файлу (абсолютный путь), а не относительный путь.
os.path.getsize ("путь к файлу")
Path('./doc.txt').stat().st_size