仅从文本文件中的某些行中删除“\ n”

时间:2016-11-20 17:33:40

标签: python

我有一个像这样组织的文本文件:

NAME: name\n
AGE: age\n
NOTES: random text\n
JOB: text
\n
NAME: name\n
AGE: age\n
NOTES: random text\n
JOB: text
\n

我只为每个数据块写了5行但是假设我有7行或更多行。我这里只写了2个块,但我的文件可能包含100多个,我想要的输出是列表(最好):

list=[[NAME: name\n, AGE: age\n, NOTES: random text\n, JOB: blabla, \n], [NAME: name\n, AGE: age\n, NOTES: random text\n, JOB: blabla, \n], [...]]

我使用此代码获得:

list_of_lists = [list[x:x+4] for x in range(0, len(list),4)]

但我的问题是random text NOTES: \n包含额外的list=[[NAME: name\n, AGE: age\n, NOTES: unwanted\n, newlines\n], [that ruin\n, my plans\n, \n, NAME: name\n] etc etc] 并且可能导致分组错误:

onCreate()

所以基本上所有的线都没问题,问题就是NOTES,人们插入了一些我不想要的马车,因为它们将文本分成了文本中的不同行和不同的项目。列表:我想删除\ n,以便将NOTES字段分为一行(在文本中)和一个项目(在列表中)

  编辑:感谢您的帮助!我已经尝试了一些你的解决方案,但仍然没有解决我的问题...所以我编辑了我的问题以更好地解释(编辑的内容以粗体显示)。

4 个答案:

答案 0 :(得分:0)

我建议做一些不同的事情:

import { ModelA, ModelB } from './models';

返回类似

的内容
result = []
d = {}
with open("file.txt") as f:
    for line in f:
        if line.startswith("NAME:"):
            if d:
                result.append(d)
            d = {}
        if any(line.startswith(key) for key in ("NAME:", "AGE:", "NOTES:")):
            key, value = line.strip().split(":", 1)
            d[key] = value
        else:
            d["NOTES"] += d["NOTES"] + line.strip()
    result.append(d)

答案 1 :(得分:0)

看起来这是一个关键值对,因此首先尝试将数据拆分为字典列表。

您可以使用text[::-1]撤消文本文件字符串,然后替换reverse_text.split(':EMAN'),然后再次反转列表中的字符串。这应该为您提供一个列表,可以解析成dict,如下所示:

list = [
    ['NAME: name\n AGE: age\n NOTES: random text\n\n'],
    ['NAME: name\n AGE: age\n NOTES: random text\n\n'],
    ...,
    ]

答案 2 :(得分:0)

您可以使用 list comprehension 来实现它:

from StringIO import StringIO

myfile = StringIO("""NAME: name\n
AGE: age\n
NOTES: random text\n
\n
NAME: name\n
AGE: age\n
NOTES: random text\n
\n""")    # StringIO creates file like object

# You list comprehesion expression 
my_list = [["{}\n".format(item) for item in group.split("\n\n")+['']] for group in myfile.read().split("\n\n\n\n")]
#                               For adding extra `\n` at the end ^                              ^ 

my_list将保留的位置:

[['NAME: name\n', 'AGE: age\n', 'NOTES: random text\n', '\n'], ['NAME: name\n', 'AGE: age\n', 'NOTES: random text\n', '\n\n', '\n']]

如果您不希望\n\n作为最后一个子列表中的倒数第二个元素,您可以将其明确删除为:

del my_list[-1][-2]

现在,您的my_list将保留值:

[['NAME: name\n', 'AGE: age\n', 'NOTES: random text\n', '\n'], ['NAME: name\n', 'AGE: age\n', 'NOTES: random text\n', '\n']]

答案 3 :(得分:0)

import re

# some example text:
my_text = """NAME: name\nAGE: age\nNOTES: random text\n\nNAME: name\nAGE: age\nJOB: job\nNOTES: random text\n\nblah \n\n blah\n\nNAME: name\nAGE: age\nNOTES: more \n random\n text\n\n""" 
# splitting up your text into a list of lists:
my_list = [[c.group(1) for c in re.finditer('(?ms)(?=(^[A-Z]+:.*?)(^[A-Z]+:|\Z))',chunk.group(1))] for chunk in re.finditer('(?ms)(?=(^NAME:.*?)(^NAME:|\Z))', my_text)]

这可以通过执行两次正则表达式搜索来实现。第一个文本查找从NAME:开始直到下一个NAME:或文件末尾之前的所有文本。这基本上将文本分成每个人的数据。然后,使用几乎相同的正则表达式将每个正则表达式分成每个属性的列表(NAMEAGEJOB等。此正则表达式假设每个属性标签都在一个大写字母的开头,并且后跟一个:

上例中的my_list内容为:

[['NAME: name\n', 'AGE: age\n', 'NOTES: random text\n\n'],
 ['NAME: name\n',
  'AGE: age\n',
  'JOB: job\n',
  'NOTES: random text\n\nblah \n\n blah\n\n'],
 ['NAME: name\n', 'AGE: age\n', 'NOTES: more \n random\n text\n\n']]