在Python中查询块设备文件的大小

时间:2010-05-05 13:30:51

标签: python linux filesize device

我有一个Python脚本,它读取标记不可读扇区的文件(通常来自光学媒体),允许重新尝试在不同的光学读取器上读取所述不可读的扇区。

我发现我的脚本不能与块设备(例如/ dev / sr0)一起使用,以便创建所包含的ISO9660 / UDF文件系统的副本,因为os.stat().st_size为零。该算法目前需要提前知道文件大小;我可以改变这一点,但问题(知道块设备大小)仍然存在,而且这里没有回答,所以我打开这个问题。

我知道以下两个相关的SO问题:

因此,我问:在Python中,如何获取块设备文件的文件大小?

5 个答案:

答案 0 :(得分:7)

我已经达到的“最干净”(即不依赖于外部卷和最可重用的)Python解决方案,是打开设备文件并在最后搜索,返回文件偏移量:

def get_file_size(filename):
    "Get the file size by seeking at end"
    fd= os.open(filename, os.O_RDONLY)
    try:
        return os.lseek(fd, 0, os.SEEK_END)
    finally:
        os.close(fd)

答案 1 :(得分:5)

特定于Linux的基于ioctl的解决方案:

import fcntl
import struct

device_path = '/dev/sr0'

req = 0x80081272 # BLKGETSIZE64, result is bytes as unsigned 64-bit integer (uint64)
buf = ' ' * 8
fmt = 'L'

with open(device_path) as dev:
    buf = fcntl.ioctl(dev.fileno(), req, buf)
bytes = struct.unpack('L', buf)[0]

print device_path, 'is about', bytes / (1024 ** 2), 'megabytes'

其他unix当然会有req,buf,fmt的不同值。

答案 2 :(得分:2)

在 Linux 中,即使没有 sudo 也可以读取 Time X Y Area 0 1 3.0 1.0 56.51 1 2 4.5 0.0 46.99 2 3 5.0 -1.0 36.75 3 4 10.0 -2.0 0.00 4 5 3.0 -3.0 54.03 。要获得 /sys/block/${dev}/size 的大小,只需执行以下操作:

/dev/sdb

另见https://unix.stackexchange.com/a/52219/384116

答案 3 :(得分:0)

尝试适应其他答案:

import fcntl
c = 0x00001260 ## check man ioctl_list, BLKGETSIZE
f = open('/dev/sr0', 'ro')
s = fcntl.ioctl(f, c)
print s

我没有合适的电脑来测试这个。我很想知道它是否有效:)

答案 4 :(得分:0)

有一个更干净的解决方案。

def blockdev_size(path):
    """Return device size in bytes.
    """
    with open(path, 'rb') as f:
        return f.seek(0, 2)

对于Python 2,最后一条语句应替换为

        f.seek(0, 2)  # returns None
        return f.tell()

魔法常数2可以用io.SEEK_END代替。