Python 2.7的splitlines函数无法在末尾反斜杠处分割字符串

3
使用Python 2.7.9,我正在尝试将DOS风格的目录列表拆分为单独的行,使用内置的splitlines函数。该列表是目录的一个示例,我的三引号字符串中的一行包含一个尾随反斜杠。问题在于以反斜杠结尾的行没有被拆分。
# DOS-style listing of the directory "B:\"
listing = """Directory of B:\
            12/15/2014  02:12 PM             1814814 BIRD.LOG
            01/01/2000  12:04 AM    <DIR>            CONFIG
            12/15/2014  02:55 PM               35060 ALLIGATOR.LOG
            03/15/2013  02:06 PM    <DIR>            MONKEY
            03/15/2013  02:06 PM    <DIR>            FROG
            03/15/2013  02:06 PM    <DIR>            BADGER
                2 File(s)    1849874 bytes
                4 Dir(s)     1674739712 bytes free
"""

# BIRD.LOG is combined with prior line ending in a backslash
print "keepends = False"
for line in listing.splitlines(False): print repr(line)

# Setting keepends=True does not help
print "keepends = True"
for line in listing.splitlines(True): print repr(line)

这里是输出:

keepends = False
'Directory of B:          12/15/2014  02:12 PM             1814814 BIRD.LOG'
'          01/01/2000  12:04 AM    <DIR>            CONFIG'
'          12/15/2014  02:55 PM               35060 ALLIGATOR.LOG'
'          03/15/2013  02:06 PM    <DIR>            MONKEY'
'          03/15/2013  02:06 PM    <DIR>            FROG'
'          03/15/2013  02:06 PM    <DIR>            BADGER'
'              2 File(s)    1849874 bytes'
'              4 Dir(s)     1674739712 bytes free'
keepends = True
'Directory of B:          12/15/2014  02:12 PM             1814814 BIRD.LOG\n'
'          01/01/2000  12:04 AM    <DIR>            CONFIG\n'
'          12/15/2014  02:55 PM               35060 ALLIGATOR.LOG\n'
'          03/15/2013  02:06 PM    <DIR>            MONKEY\n'
'          03/15/2013  02:06 PM    <DIR>            FROG\n'
'          03/15/2013  02:06 PM    <DIR>            BADGER\n'
'              2 File(s)    1849874 bytes\n'
'              4 Dir(s)     1674739712 bytes free\n'

问题在于传递keepends = True参数没有变化。Python splitlines documentation没有提到任何反斜杠的特殊处理,universal newlines approach的分割行文档也是如此。我的代码示例来自单元测试,但在真实世界中,清单将通过编程方式检索。我可以想到涉及操作输入列表或其他方法的解决方法,但我想知道为什么需要解决方法。这是一个错误吗?任何建议都将不胜感激!
1个回答

4
你的单元测试问题在于Python会将字符串常量中的\解释为转义字符。尝试将第一行改为:
listing = r"""Directory of B:\

来自Python文档:

字符串文字可以选择以字母'r'或'R'作为前缀; 这样的字符串称为原始字符串,并使用不同的规则解释反斜杠转义序列。

在实际工作场景中,如果您从命令输出中获取字符串,这不应该是一个问题。


我的问题在于我混淆了原始字符串和三引号字符串。原始字符串的目的是简化反斜杠字符的输入,而三引号的目的是简化引号和换行符的输入。它们是不同的特性,在答案中都被使用了。 - Buzzy Hopewell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接