Python 如果文件名包含单引号/撇号,为什么路径会失败?

Python 如果文件名包含单引号/撇号,为什么路径会失败?,python,Python,此处的文件存在,100%: path = "~/Music/Youtube_dl/Some Artist - 'On + Off'.m4a" assert os.path.exists(path) 但上述方法总是失败的 如果我将实际文件名更改为test_file.m4a并执行以下操作: path = "~/Music/Youtube_dl/test_file.m4a" assert os.path.exists(path) 一切正常 因此,文件名中的问题是100%。然而,我看不出解决办法。我

此处的文件存在,100%:

path = "~/Music/Youtube_dl/Some Artist - 'On + Off'.m4a"
assert os.path.exists(path)
但上述方法总是失败的

如果我将实际文件名更改为test_file.m4a并执行以下操作:

path = "~/Music/Youtube_dl/test_file.m4a"
assert os.path.exists(path)
一切正常

因此,文件名中的问题是100%。然而,我看不出解决办法。我尝试过在字符串和各种其他解决方案之前预先加上一个
u
,但似乎没有任何效果


注意:我从外部源获取文件名,无法控制某些文件名中包含单引号的事实。

~
是一个shell构造,python对此一无所知。即使
os.path.exists(“~”)
也会失败。假设它已导出,我们可以使用环境变量
HOME

import os
import os.path
path = "~/Music/Youtube_dl/Some Artist - 'On + Off'.m4a"

path = path.replace('~', os.environ['HOME'])
assert os.path.exists(path)
或者,您可以使用
os.path.expanduser
(相当便携):


您是否尝试过从终端复制非常精确的文件名?撇号可能不是你所认为的。好吧,这很有效,所以我可能会选择它作为正确答案。奇怪的是,
“~/Music/Youtube\u dl/test\u file.m4a”
与我正在使用的库
诱变剂一起工作。但上述情况并非如此
expanduser
确实有帮助。但是这很奇怪。@zerohedge:这也让我感到困惑,python并没有将开头的
~
解释为一个特殊字符(关于这个主题还有其他一些SO帖子)。也许您成功地创建了一个带有前导
~
的文件名?这是一个合法的文件名字符,尽管使用它会很愚蠢。我已经证实你说的是真的。这对我来说是一个巨大的困惑。那么,在Python脚本中使用
~
有什么意义呢?@zerohedge:在Python中使用
~
没有任何意义,除非是为了取悦习惯它的用户。据我所知,其他非shell语言也不支持将
~
直接作为目录名(尽管我不能声称知道所有语言)。
import os.path
path = "~/Music/Youtube_dl/Some Artist - 'On + Off'.m4a"

path = os.path.expanduser(path)
assert os.path.exists(path)