我是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
答案 0 :(得分:0)
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会正确解释它。
答案 1 :(得分:0)
\\
是反斜杠字符\
的转义序列。指定字符串文字时,它们会被'
或"
引用。因为有些字符可能需要指定为字符串的一部分而不能像这样输入 - 例如引号自身 - 转义序列允许您这样做。它们通常为\x
,其中x
是您想要输入的内容。现在因为所有转义序列都以反斜杠开头,反斜杠本身也会变成一个特殊字符,您无法直接在字符串文字中指定。所以你也需要逃避它。
这意味着字符串文字'\\'
实际上代表一个包含单个字符的字符串:反斜杠。原始字符串是在开始引号字符前面带有r
的字符串文字,忽略(大多数)转义序列。因此r'\\x'
实际上是两个反斜杠后跟x
的字符串。所以它与非原始字符串文字'\\\\x'
描述的字符串相同。
所有这些仅适用于字符串文字。字符串本身不包含有关是否使用原始字符串文字创建的信息,或者是否存在某些转义序列。它只包含构成字符串的所有字符。
这也意味着只要你从某个地方获得一个字符串,例如从文件中读取它,那么你就不必担心在那里转义某些东西以确保它是一个正确的字符串。它只是。
因此,在代码中,当您在z:\python\mot1 input.txt
打开文件时,需要先将该文件名指定为字符串。所以你必须使用字符串文字,或者使用反斜杠,或者使用原始字符串。
然后,当您从该文件中读取新文件名时,您已经拥有了一个真正的字符串,而且不需要再烦恼了。假设它已正确写入文件,您可以像这样使用它。
答案 2 :(得分:0)
为什么不使用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上,它还会将正斜杠转换为 反斜杠。