【问题标题】:The open() functions doesn't behave correctly with filepath containing special charactersopen() 函数在包含特殊字符的文件路径中行为不正确
【发布时间】:2018-10-09 13:14:49
【问题描述】:

我正在编写这个简单的代码:

file = input('File to read: ')
fhand = open(file, 'r')

我要打开的文件名为“test.txt”,它位于子文件夹中;因此,我在请求的输入中输入的是:'DB\test.txt'。

好吧:它不起作用,返回此错误消息:

OSError: [Errno 22]Invalid argument: 'DB\test.txt'.

我在同一目录中有另一个文件,名为“my_file.txt”,我在尝试打开它时没有遇到错误。最后我有另一个文件,叫做“new_file.txt”,这个文件也给我同样的错误。

对我来说显而易见的是 open() 函数读取“\t”和“\n”就好像它们是特殊字符一样;在网上搜索我发现没有什么能真正帮助我避免用户输入字符串中的特殊字符...... 有人可以帮忙吗?

谢谢!

【问题讨论】:

  • \t 是制表,使用原始前缀。你在使用 python 2 吗?你在回答提示时输入了什么?
  • 奇怪,通过input 输入的文本不应该将反斜杠解析为转义字符。或者,等等,您使用的是 Python 2.7 吗?由于 2.7 的 input 在您的文本上调用 eval,这可能会导致转义。如果您使用的是 Python 2.7,请考虑改用 raw_input

标签: python file filepath


【解决方案1】:

在 Python 3 中使用您的确切代码不会有任何问题(在传递需要 r 前缀的 windows literal 字符串时经常会遇到此问题。

使用 python 2,首先你必须用引号括起你的文件名,然后所有特殊字符都将被解释(\t\n ...)。除非你使用我之前提到的这个原始前缀输入r"DB\test.txt",但它开始变得很麻烦:)

所以我建议使用raw_input(并且不要输入带引号的文本)。或者 python 版本不可知的版本来覆盖不安全的input 仅适用于 python 2:

try:
    input = raw_input
except NameError:
    pass

那么您的代码将可以正常工作,并且您摆脱了代码中可能的代码注入作为奖励(请参阅 python 2 特定主题:Is it ever useful to use Python's input over raw_input?)。

【讨论】:

  • 感谢您的回答,但我使用的是 Python 3(实际上是 3.6.5),但我使用的是 Windows;我没有使用 r 前缀,我应该使用它吗?以及如何?
  • 如果使用raw_input,则不需要r前缀:只需输入不带引号或其他转义的文件路径即可
  • 但是自 Python 3.x 以来没有删除 raw_input() 吗? :)
  • 因此我的 try/except 代码是合规的。阅读我的答案:) 覆盖输入并从现在开始仅使用输入(在 python 2 中调用 raw_input)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
相关资源
最近更新 更多