【问题标题】:Python: Appending string constructed out of multiple lines to listPython:将由多行构造的字符串附加到列表中
【发布时间】:2016-07-02 15:37:30
【问题描述】:

我正在尝试解析一个 txt 文件并将句子放入符合我标准的列表中。 文本文件由几千行组成,我正在寻找以特定字符串开头的行,让我们将此字符串称为“开始”。 此文本文件中的行可以属于一起,并且以某种方式随机以\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下一句。

非常感谢!

【问题讨论】:

    标签: python string list parsing append


    【解决方案1】:

    这样的任务

    “我正在尝试解析一个 txt 文件并将句子放入符合我标准的列表中”

    我通常更喜欢使用字典来表达这种想法,例如

    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
    

    这样的事情应该就足够了..代码只是为了让您了解您可能想要做什么..您可以列出标准并对其进行循环,这会将与不同标准相关的句子添加到字典中,就像这样

    mycriterias = ['start','begin','whatever']

    for criteria in mycriterias:
        for sentence in fileDataAsAList:
           if satisfiesCriteria(criteria ,sentence):
               seperatedItems[criteria ].append(sentence)
    

    注意拼写:p

    【讨论】:

    • 这看起来很有希望!我会调查它并回到这个
    【解决方案2】:

    两个问题:

    1. 迭代字符串,而不是行:

    当你遍历一个字符串时,产生的值是一个字符,而不是一行。这意味着for line in data: 正在逐个字符地遍历字符串。用换行符拆分您的输入,返回一个列表,然后您将对其进行迭代。例如for line in data.split('\n'):

    1. 覆盖循环内的完整行

    您在循环结束时附加一个完整的行,但不是在您开始在循环内记录新行时。将循环中的if 更改为如下内容:

    if line.lower().startswith(startswith):
        if completeline:
            lines_1.append(completeline)
        completeline = line
    

    【讨论】:

    • 我明白了,我不知道迭代字符串会产生字符。我已经测试过了,确实是这样。感谢那。我不太明白添加“if completeline”是什么意思。它怎么知道那个值是真还是假?
    • 在第一次迭代中,completeline 将为空,并且您不想将空字符串添加到 lines_1 数组。空字符串是假的,所以if 会失败。
    • 谢谢,我明天去看看!
    猜你喜欢
    • 2015-03-29
    • 2011-01-04
    • 2018-09-13
    • 2012-12-05
    • 2013-07-15
    • 2012-09-14
    • 2022-12-06
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多