字符串分割线(unicode?)

String split lines (unicode?)

问题

下面显示的字符串之间有什么区别?我怎样才能按预期拆分和重新加入它们?

最终目标

我尝试从诗节中提取诗句。一些文字,例如"one\ntwo\nthree" 应在末尾打印为

1 one
2 two
3 three

在幕后,我需要此处显示的每一行以进行进一步操作 - 没有前面的数字。

状态

输出实验对比

我想知道为什么下面内部创建的字符串(参见“但是...”)表现得像预期的那样,而下面“原始文本实验”中显示的文本却没有。

learn_drama$ python3 cli.py --print_input --text_input "one\ntwo\nthree"

-- Raw text experiment --
one\ntwo\nthree
<class 'str'>
['one\ntwo\nthree']
-- End raw text experiment--
-- However... --
one\ntwo\nthree
<class 'str'>
['one', 'two', 'three']

Code/Example

learn_drama$ cat cli.py

"""Console script"""                                                                                                                   
import sys                                                                                                                             
import click                                                                                                                           
                                                                                                                                       
@click.command()
@click.option("--text_input", help="Type in some text.", default="No text")                                                           
@click.option("--print_input/--no-print_input", help="Prints text input on console.", default=False)                                  
def main(text_input, print_input):
    """Console script"""
    if print_input:
        click.echo("-- Raw text experiment --")
        click.echo(text_input)
        click.echo(type(text_input))
        click.echo(str.splitlines(text_input))
        if text_input == "":
            click.echo("No input given")
        click.echo("-- End raw text experiment--")
        click.echo("-- However... --")
        comparison_string = "one\ntwo\nthree"
        click.echo(text_input)
        click.echo(type(comparison_string))
        click.echo(str.splitlines(comparison_string))
    return 0


if __name__ == "__main__":
    sys.exit(main())  # pragma: no cover

为什么是 unicode?在问题标题中?

在搜索一些提示时,我经常偶然发现与编码相关的问题和答案。我记得在这期间我以某种方式得到了 'unicode' for type(some_value_in_between).

您从命令行收到的文本包含两个文字字符 \n。代码中的 Python 字符串包含编码为 \n 但代表一个字符(也称为 LF、'\u000a' 等)的文字换行符。

更详细一些,

python -c 'from sys import argv; [print(x) for x in argv[1]]' "foo\nbar\nbaz"

在命令行会显示输入的文本包含字符foo\nb

python -c 'for x in "foo\nbar\nbaz": print(x)'

类似地在 ob 之间显示一个 文字 换行符,等等

换句话说,\n 在 Python 源代码中的字符串中 表示一个换行符(“原始”字符串除外 r'\n' 其中反斜杠始终只是文字反斜杠)但在其他地方,\n 只是两个可打印的 ASCII 字符 \n.

这是一个常见的常见问题解答。