【问题标题】:Special shell characters when opening in a file Python在文件 Python 中打开时的特殊 shell 字符
【发布时间】:2016-08-20 19:44:59
【问题描述】:

我有一个有趣的问题,我无法通过谷歌搜索解决。

我正在尝试处理目录中的每个文件。一些文件名包含特殊的 shell 字符($() 等)。这种文件名的一个很好的例子:

FOO.-6.BAR.(nil).$0BAZ

当我尝试在 bash 中打开此文件而不进行任何转义时,我收到错误 No matches found 因此我需要以下列方式转义它:

FOO.-6.BAR.\(nil\).\$0BAZ

因此它确实在 bash 中打开(例如 cating 有效)。

但是,问题是即使我在 python 代码中以完全相同的方式转义文件名,我仍然得到IOError: [Errno 2] No such file or directory

我还注意到,当我转义特殊字符(例如f.replace('$', '\$'))时,open 中使用的最终文件名在我的斜杠(IOError: [Errno 2] No such file or directory: 'FOO.-6.BAR.\\(nil\\).\\$0BAZ')前面加了双倍,即使当我手动打印文件名时( print f) 我得到有效的FOO.-6.BAR.\(nil\).\$0BAZ

此时我有点想不通。

【问题讨论】:

  • 您是否尝试过 os.listdir('.') 来查看名称的格式,然后使用它打开它们?
  • 我似乎无法重现这一点。你用的是哪个python版本?你能分享你的代码吗?我已经试过了,没有逃跑,效果很好。
  • 是的。这实际上是我用来遍历目录中每个文件的方法,即我使用os.listdir(directory) 来获取文件列表,然后处理每个文件。名称本身是未转义的。我在 OS X 上使用 Python 2.7。

标签: python bash shell escaping character


【解决方案1】:

从 Python 打开文件时,您不需要转义任何内容,因为您根本没有执行 shell 命令。

f = open("FOO.-6.BAR.(nil).$0BAZ")

os.listdir 返回的任何文件名也是如此:

for fname in os.listdir('.'):
    f = open(fname)

【讨论】:

  • 是的,你当然是对的!这是我的主要脑放屁。我确实收到了一个错误,但这是因为我对当前文件的os.path.abspath 调用使用脚本自己的目录作为文件的根目录(这是错误的,因为文件在其他地方)。您在当前目录中处理文件的示例将我推向了解决方案。谢谢!
【解决方案2】:

您可以通过使用os.listfiles('/path/to/stuff') 查看您的目录来解决此问题。您的文件将在那里返回 \x 字符。尝试在它之后打开它。

可能,根据您的其他文件,您可能还想使用 Unicode 来查看文件。使用os.listfiles(u'/path/to/stuff') 执行此操作。

另请参阅Python - Unable to rename a file with special characters in the file name,这是一个有类似问题的帖子。

【讨论】:

    猜你喜欢
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2020-08-28
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    相关资源
    最近更新 更多