字符串中的"\n"不起作用

Xtr*_*eme 8 python string newline python-3.x

我有一小段代码用于我的操作系统:

print("Type your document below.")
print("Press enter to save.")
print("Type \\n for a new line.")
file=input()
print("Enter a file name...")
filename=input()
outFile = open(filename, "w+")
outFile.write(file)
outFile.close()
Run Code Online (Sandbox Code Playgroud)

但是当我运行这段代码(在def中)时,请说我输入如下内容:

foo \n bar
Run Code Online (Sandbox Code Playgroud)

因为当收到用户的输入时输入不起作用,所以你必须使用\n.

该文件结果如下:

foo \n bar
Run Code Online (Sandbox Code Playgroud)

代替:

foo
bar
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 10

\n是一个仅在字符串文字中起作用的转义序列.input()不接受字符串文字,它接受用户输入的文本而不对其进行任何处理,因此任何进入\后面的人都会n产生一个由两个字符组成的字符串,一个反斜杠和一个字母n,而不是换行符.

你必须自己处理这些逃脱:

file = file.replace(r'\n', '\n')
Run Code Online (Sandbox Code Playgroud)

在这里,我使用了原始字符串文字,它也不支持转义序列,以定义\后跟a 的文字反斜杠n.

或者,反复询问用户新的文件名,直到完成:

lines = []
print('Type in your document, followed by a blank line:')
while True:
    line = input("> ")
    if not line:
        break
    lines.append(line)
file = '\n'.join(lines)
Run Code Online (Sandbox Code Playgroud)

演示:

>>> lines = []
>>> print('Type in your document, followed by a blank line:')
Type in your document, followed by a blank line:
>>> while True:
...     line = input("> ")
...     if not line:
...         break
...     lines.append(line)
...
> foo
> bar
>
>>> lines
['foo', 'bar']
>>> '\n'.join(lines)
'foo\nbar'
Run Code Online (Sandbox Code Playgroud)


Vee*_*rac 6

请注意,如果您想支持 Python 风格的字符串(不仅支持\\n, \\t,\\r\\u1234),您应该codecs.decodeunicode_escape处理程序一起使用:

\n\n
contents = input()\ncontents = codecs.decode(contents, "unicode_escape")\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,这将会改变

\n\n
foo\\nbar\\\\nbash\\u1234\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
foo\nbar\\nbash\xe1\x88\xb4\n
Run Code Online (Sandbox Code Playgroud)\n\n

您还需要处理错误。您可以通过捕获UnicodeDecodeError或使用错误替换策略来做到这一点:

\n\n
contents = input()\ncontents = codecs.decode(contents, "unicode_escape", errors="replace")\n
Run Code Online (Sandbox Code Playgroud)\n\n

遗憾的是,这似乎与 unicode 字符混淆:

\n\n
codecs.decode("\xce\xb1", "unicode_escape")\n#>>> \'\xc3\x8e\xc2\xb1\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

我知道的最简单的修复方法是首先使用以下命令转义raw_unicode_escape

\n\n
contents = input()\ncontents = contents.encode("raw_unicode_escape")\ncontents = contents.decode("unicode_escape")\n
Run Code Online (Sandbox Code Playgroud)\n\n

这可能比您需要的要复杂得多,所以我建议实际上不要这样做。

\n


Way*_*ner 5

正如Martijn解释的那样,您需要自己处理替换。实际上,最简单的方法是使用.replace方法:

>>> print(input('Enter \\n for newline: ').replace('\\n', '\n'))
Enter \n for newline: This is my \nnewline
This is my 
newline
Run Code Online (Sandbox Code Playgroud)

这对于\n转义序列会很好用,但是如果您想要其他人(例如\t),则需要自己实现。