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 个字段是分区的 name
。 name
到 int
的转换将不起作用。
当你从该行得到第 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
我目前正在进行一个项目,该项目将磁盘上的所有分区设置为 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 个字段是分区的 name
。 name
到 int
的转换将不起作用。
当你从该行得到第 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