如何使用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
相关产品推荐
相关产品推荐

