Linux系统下用Python提取USB挂载路径的问题求助
提取Linux系统中USB设备的挂载路径
需求说明
在Linux系统下,需通过Python代码提取USB设备的挂载路径,仅保留/media/joy/DATA这类目标路径。使用.absolute(file_name)得到的是本地用户目录路径,不符合需求;尝试调用lsblk命令过滤/media/joy路径时出现处理问题。
期望输出:
/media/joy/DATA /media/joy/DATA2 /media/joy/DATA1
现有代码问题
尝试的代码:
import os import subprocess a = subprocess.check_output(['lsblk']) str_a = str(a) # 按"\n"分割每一行 str_a_splited = str_a.split("\n") USB_info = [s for s in str_a_splited if "/media/joy" in s] print("= = = = ") print(USB_info)
核心问题:
subprocess.check_output返回bytes类型,直接用str(a)转换会保留b'前缀和转义字符(如树形符号的\xe2\x94\x9c),导致分割后的内容并非真实行数据。lsblk默认树形输出包含特殊字符、多行挂载点,增加了过滤提取的复杂度。
解决方案
方法1:修正解码与字符串处理
先将bytes对象正确解码为字符串,再逐行提取挂载路径:
import subprocess # 执行lsblk并解码为utf-8字符串 output = subprocess.check_output(['lsblk'], encoding='utf-8') # 分割行并过滤空行 lines = [line.strip() for line in output.split('\n') if line.strip()] usb_mounts = [] for line in lines: if '/media/joy' in line: # 分割行内容,取最后一个字段作为挂载路径 parts = line.split() usb_mounts.append(parts[-1]) # 打印结果 for path in usb_mounts: print(path)
方法2:让lsblk输出结构化数据(更高效)
利用lsblk参数直接输出目标字段,避免处理复杂树形格式:
import subprocess # 指定输出MOUNTPOINTS字段,去掉表头,用原始格式输出 output = subprocess.check_output( ['lsblk', '--output', 'MOUNTPOINTS', '--noheadings', '--raw'], encoding='utf-8' ) # 筛选包含/media/joy的非空路径 usb_mounts = [ path.strip() for path in output.split() if path.strip() and '/media/joy' in path.strip() ] for path in usb_mounts: print(path)
方法3:通过/proc/mounts提取(更可靠)
读取系统挂载文件,结合USB设备特征精准筛选:
usb_mounts = [] with open('/proc/mounts', 'r') as f: for line in f: parts = line.split() device = parts[0] mount_path = parts[1] # USB设备通常以/dev/sdb、/dev/sdc等形式命名 if device.startswith('/dev/sd') and device[5] >= 'b' and '/media/joy' in mount_path: usb_mounts.append(mount_path) for path in usb_mounts: print(path)
以上三种方法均可输出期望结果:
/media/joy/DATA /media/joy/DATA2 /media/joy/DATA1
内容的提问来源于stack exchange,提问作者j ton
相关产品推荐
相关产品推荐

