Linux下Python无法自动获取USB文件有效读写路径问题求助
问题描述
在Linux系统下使用Python操作USB文件时遇到以下问题:
- 能获取到文件路径
/home/joy/aaa.txt,但仅有/media/joy/Data/aaa.txt(二者指向同一文件)可正常用于读写,无法自动生成该有效路径; - 是否存在其他读写USB文件的方法?
此前查阅过相关内容,但给出的解决方案是切换盘符(如F:),与Linux场景不符。
测试代码
from pathlib import Path import time from usb.core import find from usb.util import get_string import usb.backend.libusb1 import re import usb.core import usb.util import os import numpy as np import os.path from os import path print("File Path:", Path("aaa.txt").absolute()) print("Directory Path:", Path().absolute()) # with open('/home/joy/aaa.txt') as f: # contents_path1 = f.read() # print(contents_path1) with open('/media/joy/Data/aaa.txt') as f: contents_path2 = f.read() print(contents_path2)
有效路径下的输出(/media/joy/Data/aaa.txt)
File Path: /home/joy/aaa.txt Directory Path: /home/joy The input: 5555555 66666666666 6 665 13 6 654521
已尝试的代码
曾尝试使用os.path.abspath(),但仅能手动修改路径,更换USB后失效:
from pathlib import Path import time from usb.core import find from usb.util import get_string import usb.backend.libusb1 import re import usb.core import usb.util import os import numpy as np import os.path from os import path # with open('/home/joy/aaa.txt') as f: # contents_path1 = f.read() # print(contents_path1) with open('/media/joy/Data/aaa.txt') as f: contents_path2 = f.read() print(contents_path2) dirname = os.path.dirname("aaa.txt") filename = os.path.join(dirname, '/dadasad/aaa.txt') print(filename) print("File Path:", Path("aaa.txt").absolute()) print("Directory Path:", Path().absolute())
尝试代码的输出
33333 55555 444 /dadasad/aaa.txt File Path: /home/joy/aaa.txt Directory Path: /home/joy
解决方案
问题1:自动生成USB文件的有效路径
Linux下USB设备默认挂载在/media/<用户名>/目录下,可通过以下两种方式自动定位有效路径:
方式1:遍历挂载目录查找目标文件
直接遍历/media/joy/下的所有子目录,检查目标文件是否存在:
import os target_filename = "aaa.txt" base_mount_dir = "/media/joy/" # 遍历/media/joy下的所有目录 for root, _, files in os.walk(base_mount_dir): if target_filename in files: valid_path = os.path.join(root, target_filename) print(f"找到有效路径:{valid_path}") # 执行读写操作 with open(valid_path, 'r') as f: print(f.read()) break
方式2:解析系统挂载信息获取挂载点
通过读取/proc/mounts文件(系统挂载信息)筛选USB设备的挂载点,再拼接文件路径:
def get_usb_mount_points(): mount_points = [] # 读取系统挂载信息 with open('/proc/mounts', 'r') as f: for line in f: parts = line.strip().split() # 筛选/media/joy下的USB设备挂载点(匹配常见文件系统类型) if '/media/joy' in parts[1] and parts[2] in ['vfat', 'ext4', 'ntfs']: mount_points.append(parts[1]) return mount_points target_filename = "aaa.txt" usb_mounts = get_usb_mount_points() # 遍历挂载点查找目标文件 for mount_point in usb_mounts: full_path = os.path.join(mount_point, target_filename) if os.path.exists(full_path): print(f"有效路径:{full_path}") with open(full_path, 'r') as f: print(f.read()) break
问题2:其他读写USB文件的方法
方式1:配置固定挂载路径(推荐)
通过udev规则和fstab配置,让USB设备每次都挂载到固定路径,避免频繁查找:
- 执行
blkid命令查看USB设备的UUID(如UUID=1234-ABCD); - 编辑
/etc/fstab文件,添加一行配置(根据文件系统类型调整):UUID=1234-ABCD /mnt/usb vfat defaults 0 0 - 创建固定挂载目录:
sudo mkdir /mnt/usb; - 测试挂载:
sudo mount /mnt/usb。
之后USB设备会自动挂载到/mnt/usb,直接使用/mnt/usb/aaa.txt即可读写。
方式2:底层设备节点操作(进阶)
若需要底层控制,可直接访问USB设备节点(如/dev/sdb1),但需要root权限,且需自行处理文件系统解析,仅适合特殊场景。
内容的提问来源于stack exchange,提问作者j ton
相关产品推荐
相关产品推荐

