Python从列表转换为字符串时处理换行符

Python Dealing with Newline Characters When Converting From List to String

我有一个关于换行符和返回字符的问题。呃,这很难解释,但我会尽力的。

我有列表形式的数据。列表的成员中有换行符,因此。

1
2
3
 example_list = ["I've always loved jumping

"]

为了使用nlp-though-nltk标记这个句子,我需要一个字符串。当NLTK根据我运行的一些测试和NLTK教程中的证据标记化时,它将忽略换行符和其他转义字符。

问题是,当我试图将example_list转换为字符串时,我得到了这个输出

1
2
3
4
 str(example_list)
 '["I\'ve always loved jumping\
\
"]'

注意,所有换行符现在都变成了一个转义的正斜杠。尝试将其标记化会产生一个可怕的结果,在这里,nltk认为跳转是一个大单词,因为它认为带有两个斜杠的换行符实际上是文本。

是否有人知道任何技巧或良好的实践,以确保换行符从不存在于我的列表中,或者在转换为字符串时忽略这些字符或不"双转义"。

最后,对于如何处理换行字符以及这些字符如何与不同的数据类型交互等相关的资料,是否有人有任何建议,因为它非常令人困惑。

谢谢!


您正在解决错误的问题:从您显示的输出中可以清楚地看到,您在一个实际包含方括号、引号和反斜杠的文件中读取的内容。换句话说,这些
不是新行,而是实际的\n序列。这里有一个(三重引用,原始)字符串,可以重现您的问题:

1
2
3
4
5
6
7
>>> mess = r'''["I've always loved jumping

"]'''
>>> str(mess)
'["I\'ve always loved jumping\
\
"]'

当然,您没有将数据放在原始字符串中;您是通过读取一个您自己创建的文件得到的,如下所示:

1
2
with open("newfile.txt","w") as datafile:
    datafile.write(str(list_of_strings))      # <-- Not a good idea

这是你的错。写一个字符串只会输出字符串内容,但是在列表中调用write()会打印出它的repr(),所以在文件中会出现引号和反斜杠。像这样正确地写出字符串列表:

1
2
with open("newfile.txt","w") as datafile:  
    datafile.writelines(list_of_strings)

…它基本上是这个的缩写:

1
2
3
with open("newfile.txt","w") as datafile:
   for s in list_of_strings:
       datafile.write(s)

这样做,当你读回你的文件时,它会正常运行,而不必玩游戏。


您的列表中已经有字符串。将列表转换为字符串不是您想要的:这是为了显示列表,例如用于调试。

你想要的(我假设)是从列表中提取字符串。这会导致换行符保持原样。至少有两种方法可以做到这一点:

为了使单词标记化最有效,最好先做句子标记化。您的示例只显示一个包含单个元素的列表,而该元素恰好包含一个句子。如果您的数据总是每个元素有一个句子(即,您已经有了句子拆分文本),您可以简单地执行以下操作:

1
2
3
for sentence in example_list:
    tokens = word_tokenize(sentence)
    # Do something with the tokens of this sentence...

但是,如果文本尚未进行句子拆分,则需要先执行该操作。关于您的数据,有两种可能性:列表元素要么是段落,要么是任意片段。

在段落的情况下,假设每个元素包含多个句子,但句子从不跨越多个元素。在这种情况下,代码可能如下所示:

1
2
3
4
for paragraph in example_list:
    for sentence in sent_tokenize(paragraph):
        tokens = word_tokenize(sentence)
        # Do something with the tokens of this sentence...

在最后一种情况下,如果列表元素是任意片段,句子跨越多个元素,我们需要先将它们连接起来。NLTK的工具期望一个句子由一个连续的字符串组成,因此必须首先连接所有片段。这样做:

1
2
3
4
text = ''.join(example_list)
for sentence in sent_tokenize(text):
    tokens = word_tokenize(sentence)
    # Do something with the tokens of this sentence...

希望这能给你一些线索!