我有一个像这样组织的文本文件:
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字段分为一行(在文本中)和一个项目(在列表中)
编辑:感谢您的帮助!我已经尝试了一些你的解决方案,但仍然没有解决我的问题...所以我编辑了我的问题以更好地解释(编辑的内容以粗体显示)。
答案 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:
或文件末尾之前的所有文本。这基本上将文本分成每个人的数据。然后,使用几乎相同的正则表达式将每个正则表达式分成每个属性的列表(NAME
,AGE
,JOB
等。此正则表达式假设每个属性标签都在一个大写字母的开头,并且后跟一个:
。
上例中的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']]