Python 在分区列表上拆分

Python split on the partition list

我目前正在进行一个项目,该项目将磁盘上的所有分区设置为 Ubuntu 20。

def get_partitions():
    """
    This function returns a list of partition objects.
    """
    partitions = []
    for line in open('/proc/partitions'):
        if line.startswith('major'):
            continue
        fields = line.split()
        partitions.append(partition(
            int(fields[0]),
            int(fields[1]),
            int(fields[3]),
            fields[5]
        ))
    return partitions

但是我有这个错误:

Traceback (most recent call last):
  File "/home/mathieu-s/Documents/opt/repo/dosm/disk/disk_scanner.py", line 69, in <module>
    print(get_partitions())
  File "/home/mathieu-s/Documents/opt/repo/dosm/disk/disk_scanner.py", line 62, in get_partitions
    int(fields[0]),
IndexError: list index out of range

有人可以帮助我吗?

错误说明

主要错误

当您在 Ubuntu 20.04 中从 /proc/partitions 获取分区数据时,您的输出大约为:

major minor  #blocks  name

   7        0       5956 loop0
   7        1          4 loop1
   7        2       9240 loop2
   7        3       9244 loop3
   7        4     151112 loop4
   7        5     135924 loop5
   7        6     283688 loop6
   7        7      63580 loop7
 259        0  500107608 nvme0n1
 259        1     834560 nvme0n1p1
 259        2    8388608 nvme0n1p2
 259        3  490883072 nvme0n1p3
   7        8     101824 loop8

你可以看到第二行是空的,但在你的代码中你没有检查这种情况。

第二个错误

行分区数据:

major minor  #blocks  name
   7        0       5956 loop0

当您获取行的字段时,您将第 3 个字段转换为 int,但第 3 个字段是分区的 namenameint 的转换将不起作用。

当你从该行得到第 5 个字段时,它会显示一个错误,因为这个字段在 Ubuntu 20.04 的文件分区上不存在。


可能的解决方案

修复第一个错误:空行

要解决主要错误,您可以简单地修改您的 if 条件:

        if line.startswith('major') or line.startswith('\n'):

修复第二个问题:字段编号

要解决第二个问题,您可以将 append 中的代码修改为:

        partitions.append(partition(
            int(fields[0]),
            int(fields[1]),
            int(fields[2]),
            fields[3]
        ))

可能的解决方案的所有代码:

def get_partitions():
    """
    This function returns a list of partition in the disk.
    """
    partitions = []
    for line in open('/proc/partitions'):
        if line.startswith('major') or line.startswith('\n'):
            continue
        fields = line.split()
        partitions.append(partition(
            int(fields[0]),
            int(fields[1]),
            int(fields[2]),
            fields[3]
        ))
    return partitions