我正在尝试解析txt文件并将句子放入符合我标准的列表中。
文本文件由几千行组成,我正在查找以特定字符串开头的行,让我们调用此字符串'start'。
此文本文件中的行可以属于一起,并以某种方式随机分隔\n
。
这意味着我必须查找以'start'开头的任何字符串,将其置于空字符串'complete'中,然后继续扫描每一行,看看它是否也以'start'开头。
如果没有,那么我需要将其附加到'完成',因为它是整个句子的一部分。如果确实如此,我需要将“完成”附加到列表中,创建一个新的空“完整”字符串并开始追加到该字符串。这样我就可以循环遍历整个文本文件,而无需关注句子存在的行数。
我的代码因此:
import sys, string
lines_1=[]
startswith = ('keys', 'values', 'files', 'folders', 'total')
completeline = ''
with open (sys.argv[1]) as f:
data = f.read()
for line in data:
if line.lower().startswith(startswith):
completeline = line
else:
completeline += line
lines_1.append(completeline)
# check some stuff in output
for l in lines_1:
print "______"
print l
print len(lines_1)
然而,这会将整个内容放在列表中的1个项目中,我希望将所有内容分开。
请记住,组成一个句子的行可以跨越一行,两行,10行或1000行,因此需要发现下一个startswith
值,将现有completeline
附加到列表中然后填写completeline
下一句话。
非常有责任!
答案 0 :(得分:0)
对于像这样的任务
"我试图解析一个txt文件并将句子放入符合我标准的列表中#34;
我通常更喜欢使用字典来表达这种想法,例如
from collections import defaultdict
seperatedItems = defaultdict(list)
for sentence in fileDataAsAList:
if satisfiesCriteria("start",sentence):
seperatedItems["start"].append(sentence)
def satisfiesCriteria(criteria,sentence):
if sentence.lower.startswith(criteria):
return True
return False
这样的东西应该足够......代码只是为了让你了解你可能想做什么..你可以有标准列表并循环它们,这将把与不同creterias相关的句子添加到这样的字典中
mycriterias = ['开始','开始','无论']
for criteria in mycriterias:
for sentence in fileDataAsAList:
if satisfiesCriteria(criteria ,sentence):
seperatedItems[criteria ].append(sentence)
注意拼写:p
答案 1 :(得分:0)
两个问题:
当你遍历一个字符串时,产生的值是一个字符,而不是一行。这意味着for line in data:
在字符串中逐字逐句。按换行符拆分输入,返回一个列表,然后迭代。例如for line in data.split('\n'):
在循环结束时追加一条完整的行,但在循环内开始记录新行时则不行。将循环中的if
更改为以下内容:
if line.lower().startswith(startswith):
if completeline:
lines_1.append(completeline)
completeline = line