Python拆分文本文件保留换行符

时间:2015-11-21 18:05:42

标签: python split newline counter

我正在尝试将文本文件拆分为单词,\n被视为一个单词。

我的输入是这个文本文件:

War and Peace

by Leo Tolstoy/Tolstoi

我想要一个这样的列表输出:

['War','and','Peace','\n','\n','by','Leo','Tolstoy/Tolstoi']

使用.split()我明白了:

['War', 'and', 'Peace\n\nby', 'Leo', 'Tolstoy/Tolstoi']

所以我开始编写一个程序,将\ n作为单独的条目放在单词之后,代码如下:

for oldword in text:
counter = 0
newword = oldword
while "\n" in newword:
    newword = newword.replace("\n","",1)
    counter += 1

text[text.index(oldword)] = newword

while counter > 0:
    text.insert(text.index(newword)+1, "\n")
    counter -= 1

然而,该程序似乎挂在counter -= 1一行,我不能为我的生活找出原因。

注意:我意识到这是工作,结果将是['Peaceby',“\ n”,“\ n”];这是一个不同的问题,以后要解决。

4 个答案:

答案 0 :(得分:4)

您不需要这么复杂的方式,您只需使用正则表达式和re.findall()来查找所有单词和新行:

>>> s="""War and Peace
... 
... by Leo Tolstoy/Tolstoi"""
>>> 
>>> re.findall(r'\S+|\n',s)
['War', 'and', 'Peace', '\n', '\n', 'by', 'Leo', 'Tolstoy/Tolstoi']

'\S+|\n'将匹配所有无空白字符的组合,长度为1或更长(\S+)或新行(\n)。

如果要从文件中获取文本,可以执行以下操作:

with open('file_name') as f:
     re.findall(r'\S+|\n',f.read())

详细了解正则表达式http://www.regular-expressions.info/

答案 1 :(得分:0)

为了摆脱两个\n字符并成功分割空格以使列表的每个索引成为不同的单词,您可以先用单个空格替换\n\n的值。 .. string.replace('\n\n', ' ')并将其等同为新字符串,然后按空格分隔... newString.split(' ')

答案 2 :(得分:0)

当您正在阅读文件时,您可以逐行处理事物,这样您就可以在适当处理换行符时分割一行:

>>> [word for line in inputFile for word in line.rstrip('\n').split() + ['\n']]
['War', 'and', 'Peace', '\n', '\n', 'by', 'Leo', 'Tolstoy/Tolstoi', '\n']

简单分解:

  • for line in inputFile:对于inputFile中的每一行
  • for word in line.rstrip('\n').split() + ['\n']:剥离换行符并拆分行,将新行重新添加为单独的元素

如前所述,如果您使用split()而没有分隔符,那么您实际上并不需要rstrip('\n')

您可以将这些精确的表达式用作循环而不是列表理解:

result = []
for line in inputFile:
    for word in line.rstrip('\n').split():
        result.append(word)
    result.append('\n')
print(result)

给出了相同的输出:

['War', 'and', 'Peace', '\n', '\n', 'by', 'Leo', 'Tolstoy/Tolstoi', '\n']

答案 3 :(得分:0)

这是另一种变化:

with open('data.txt') as fobj:
    for line in fobj:
        words.extend(line.split())
        words.append('\n')

它会拆分所有空格中的单词,包括标签。