微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何为 Google Drive API 转义文件名

如何解决如何为 Google Drive API 转义文件名

我发现,如果在 Google Drive API 中搜索带有撇号 (') 的文件名,我需要使用 \ 对撇号进行转义。例如:

# file_name is "tim's file"
file_name = file_name.replace("'","\\'")
# file_name is "tim\'s file"

response = service.files().list(q = "name='" + file_name + "'").execute() #works

docs 提到反斜杠也需要特殊处理。

我的问题是文件名中特殊字符问题的一般解决方案是什么,是否还有其他类似的字符需要转义?

解决方法

TL;DR:不,没有通用的方法来处理转义 '\ Google 驱动器查询(以及其他可能的 Google API)。每个 API 提供商(Microsoft、Amazon、Twitter 等)都有自己的文件名/字符串转义规则,因此为每个 API 提供商创建一个会很乏味。但是,它应该是他们提供的 API 客户端的一部分。

我的问题是解决文件名中特殊字符问题的一般方法是什么

这与 sanitising strings for actual filenames 的问题不同,因为本地文件系统不遵循与 GDrive 相同的规则。

还有其他类似的需要转义的字符吗?

据我所知,正如您所指出的,GDrive 只需要转义撇号 (') 和反斜杠 (\)。至于实际请求,有:

注意:这些示例使用未编码的 q 参数,其中 name = 'hello' 被编码为 name+%3d+%27hello%27。客户端库会自动处理这种编码。

那部分可能由 google-api-python-client 处理。

至于您需要的两个特定替代品:

file_name = r"tim's file\has slashes"
print(file_name)
# tim's file\has slashes

print(file_name.replace('\\','\\\\').replace("'","\\'"))
# tim\'s file\\has slashes

# or,better
print(file_name.replace('\\',r"\'"))
# tim\'s file\\has slashes

# using raw strings also for the backslash replacement
print(file_name.replace('\\',r'\\').replace("'",r"\'"))
# tim\'s file\\has slashes

请注意,在第一个替换的 raw strings 部分中使用 find 进行反斜杠转义是没有意义的,因为无论如何都需要对关闭引号之前的尾随反斜杠进行转义。并且 r'\' 不是有效的 Python 字符串 (SyntaxError: EOL while scanning string literal)。但是,r'\\' 表示两个反斜杠,因为在原始字符串中,第一个反斜杠不会转义第二个反斜杠。即 '\\' vs r'\\' == 1 个反斜杠 vs 2 个反斜杠。如果你想要3 or any odd number of number of backslashes

顺便说一句,替换顺序很重要,因为如果你反过来做,那么为撇号添加的反斜杠就会被进一步转义:

print(file_name.replace("'",r"\'").replace('\\',r'\\'))  # WRONG!
# tim\\'s file\\has slashes

并且确实使用 f-strings 进行查询,它更具可读性:

f"name='{file_name}'"
# "name='tim\\'s file\\\\has slashes'"

print(f"name='{file_name}'")
# name='tim\'s file\\has slashes'
,

如果您在撇号中传递文件名,则应仅替换它们。这是正确的方法:

file_name = file_name.replace("'","\'")

原因如下:

>>> print('\'')
'
>>> print('\\'')
  File "<stdin>",line 1
    print('\\'')
               ^
SyntaxError: EOL while scanning string literal

你也可以这样做:

response = service.files().list(q = f"name='{file_name}'").execute()

它更容易、更干净。

编辑:我在文档中读到像 \ 这样的字符也应该被替换。因此,您可以将 \ 替换为 \\

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。