【问题标题】:String literals for file names文件名的字符串文字
【发布时间】:2014-01-16 12:15:38
【问题描述】:

我是 Python 新手 - 但不是编程新手,而且学习曲线有点陡峭。

我有一个程序可以读取多个输入文件 - 第一个输入文件包含(除其他外)路径并命名其他文件。

我可以打开文件并读取名称 OK。如果我打印字符串,它看起来像这样

Z:\ \python\ \rb_data.dat\n'

我所有的“\”都变成了“\ \”我想我可以通过使用“r”前缀将它转换为文字来解决这个问题。

我的问题是如何将前缀附加到字符串变量??

这就是我想做的:

modat = open('z:\\python\mot1 input.txt') # first input file containing names of other file

rbfile = modat.readline()  # get new file name

rbdat = open(rbfile)   # open new file

【问题讨论】:

  • 这里有什么问题? "\\" 可以用于路径....

标签: python string file literals


【解决方案1】:

\\ 是反斜杠字符\转义序列。当您指定字符串文字时,它们会被'" 引用。因为您可能需要将某些字符指定为无法像这样输入的字符串的一部分——例如引号本身——转义序列允许您这样做。它们通常是\x,其中x 是您要输入的内容。现在因为所有转义序列都以反斜杠开头,所以反斜杠本身也变成了一个特殊字符,您不能直接在字符串文字中指定它。所以你也需要逃避它。

这意味着字符串文字'\\' 实际上表示一个带有单个字符的字符串:反斜杠。原始字符串,即在开头引号字符前带有 r 的字符串文字,忽略(大多数)转义序列。所以r'\\x' 实际上是两个 反斜杠后跟x 的字符串。所以它与非原始字符串文字 '\\\\x' 描述的字符串相同。

所有这些都只适用于字符串文字。字符串本身不包含有关它是否使用原始字符串文字创建的信息,或者是否需要转义序列。它只包含构成字符串的所有字符。

这也意味着一旦你从某个地方得到一个字符串,例如从一个文件中读取它,那么你就不需要担心在那里转义一些东西来确保它是一个正确的字符串。就是这样。

因此,在您的代码中,当您在z:\python\mot1 input.txt 打开文件时,您需要先将该文件名指定为字符串。所以你必须使用字符串文字,要么转义反斜杠,要么使用原始字符串。

然后,当您从该文件中读取新文件名时,您已经有了一个真正的字符串,并且不需要再为任何事情而烦恼。假设它已正确写入文件,您可以这样使用它。

【讨论】:

  • 谢谢你——这是 poke 的评论“假设它被正确地写入文件”让我思考。如果我没有输入错误的文件名,一切都会很好 - 错字,真是个笨蛋!
【解决方案2】:

Python 字符串(以及 StackOverflow 上的代码块中)中的反斜杠 \ 实际上意味着“以不同的方式处理下一个字符”。由于它是为此目的而保留的,因此当您的字符串中实际上 有一个反斜杠时,它必须被前面的反斜杠“转义”:

>>> myString = "\\" # the first one "escapes" the second

>>> myString = "\" # no escape, so...
SyntaxError: EOL while scanning string literal

>>> print("\\") # when we actually print out the string
\

简而言之,你基本上可以在你的字符串中忽略它。如果你将rbfile 传递给open,Python 会正确解释它。

【讨论】:

    【解决方案3】:

    为什么不用os.path.normcase,像这样:

    with open(r'z:\python\mot1 input.txt') as f:
       for line in f:
          if line.strip():
             if os.path.isfile(os.path.normcase(line.strip())):
                  with open(line.strip()) as f2:
                      # do something with
                      # f2
    

    来自os.path.normcase的文档:

    规范化路径名的大小写。在 Unix 和 Mac OS X 上,返回 路径不变;在不区分大小写的文件系统上,它转换 小写的路径。 在 Windows 上,它还将正斜杠转换为 反斜杠。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 2015-04-04
      • 2017-10-11
      • 2013-05-12
      • 2021-07-10
      相关资源
      最近更新 更多