You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下Python无法自动获取USB文件有效读写路径问题求助

问题描述

在Linux系统下使用Python操作USB文件时遇到以下问题:

  1. 能获取到文件路径/home/joy/aaa.txt,但仅有/media/joy/Data/aaa.txt(二者指向同一文件)可正常用于读写,无法自动生成该有效路径;
  2. 是否存在其他读写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设备每次都挂载到固定路径,避免频繁查找:

  1. 执行blkid命令查看USB设备的UUID(如UUID=1234-ABCD);
  2. 编辑/etc/fstab文件,添加一行配置(根据文件系统类型调整):
    UUID=1234-ABCD /mnt/usb vfat defaults 0 0
    
  3. 创建固定挂载目录:sudo mkdir /mnt/usb;
  4. 测试挂载:sudo mount /mnt/usb。
    之后USB设备会自动挂载到/mnt/usb,直接使用/mnt/usb/aaa.txt即可读写。

方式2:底层设备节点操作(进阶)

若需要底层控制,可直接访问USB设备节点(如/dev/sdb1),但需要root权限,且需自行处理文件系统解析,仅适合特殊场景。


内容的提问来源于stack exchange,提问作者j ton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:55:14