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

如何使用Python的S3FS删除含连字符与括号的S3文件?

解决S3FS删除含特殊字符文件的报错问题

问题背景

S3存储桶路径s3://<bucket_name>/data/cache/下存在文件data_[2022-10-03:2022-10-23].csv.gzip,使用S3FS的rm/delete方法删除时触发error('bad character range 2-1 at position 54')异常;尝试转义特殊字符或re.escape()无效,改用底层boto3的delete_object无报错但文件未被删除。

解决方案

1. 关闭S3FS的glob匹配

S3FS的rm/delete方法默认会将路径解析为glob表达式,方括号[]和连字符-会被识别为通配符语法,导致解析错误。只需调用方法时关闭glob匹配:

filename = 'data_[2022-10-03:2022-10-23].csv.gzip'
data_filepath = 's3://<bucket_name>/data/cache'
# 关闭glob匹配,按精确路径删除
fs.rm(f"{data_filepath}/{filename}", glob=False, recursive=False)

或使用delete方法:

fs.delete(f"{data_filepath}/{filename}", glob=False)

2. 修正boto3的路径问题

boto3未删除文件通常是Key参数路径与实际文件Key不匹配。先确认文件的准确Key:

import boto3
s3 = boto3.client('s3')
bucket_name = '<bucket_name>'
prefix = 'data/cache/'

# 列出前缀下的所有文件,获取目标文件的准确Key
response = s3.list_objects_v2(Bucket=bucket_name, Prefix=prefix)
for obj in response.get('Contents', []):
    print(obj['Key'])

拿到准确Key后,直接执行删除:

# 替换为实际输出的Key
s3.delete_object(Bucket=bucket_name, Key='data/cache/data_[2022-10-03:2022-10-23].csv.gzip')

3. 直接使用S3FS的精确删除方法

部分S3FS版本提供rm_file方法,专门用于精确删除单个文件,无需处理glob:

fs.rm_file(f"{data_filepath}/{filename}")

内容的提问来源于stack exchange,提问作者Edy Bourne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:47:25