返回不返回完整数据python

时间:2014-11-17 08:35:58

标签: python string function csv tsv

我试图编写一个从文本文件中获取数据的python脚本,在两个字符串之间获取行,包括第一个字符串,并在另一个函数中使用提取的数据。

def Extracted_data(name):
    copy = False
    for data in name:
        if data.startswith ("title"):
            copy = True
        elif data.startswith ("table"):
            copy = False
        elif copy:
            return data

name = open ("file.txt").readlines()
def a():
    data = Extracted_data(name)
    print data

a()

这不是打印整个数据;它只打印第一行。示例数据如下所示。它是一个以制表符分隔的文本文件。

title   A   B   F
date   23   24   12
time   1   2   5
table   y   n   y
others   rgg   grgr   grgr

我想要

title   A   B   F
date   23   24   12
time   1   2   5

只运行第一个函数会打印出来,但是当它与第二个函数一起使用时,我只能得到

title   A   B   F

我该如何解决这个问题?我哪里错了?

3 个答案:

答案 0 :(得分:0)

两点:

首先,data是在您遍历name时不断更新的值。该变量(除非您在循环中重新定义它,您不应该这样)将始终定义为您当前从name读取的行,因此返回data将始终只返回一行

其次,你使用if-elif条件的方式似乎有点奇怪。只有在所有先前的elifif语句都被评估为false时,才会评估elif,因此永远不会有将copy设置为true且{{}的迭代返回1}},因为只有其中一行可以执行。

我不确定为什么“第一个函数”打印出你所期望的 - 假设你的意思是data,这是令人惊讶的,因为方法中的任何地方都没有Extracted_data函数。

但是,这似乎可能是一种更好的方式来做你想要的事情:

print

没有理由检查标题是否是想要的标题 - 如果是,则将其复制到字符串中。我还对此进行了修改,以便您传入允许的标头列表,以防万一您只想重复使用它来获取def Extracted_data(name, permitted_headers): result = "" for data in name: for header in permitted_headers: if not data is None and data.startswith(header): result += data break return result title,或任何其他组合。

答案 1 :(得分:0)

在代码中查看我的评论:

def Extracted_data(name):
    copy = False  # This will false all the time you enter the function
    for data in name:
        if data.startswith ("title"):
            copy = True
        elif data.startswith ("table"):
            copy = False
        elif copy:  # May be "else:"? because you want this if everything else is false
            return data # what will you return after for loop?

如果我做了一些代码修饰:

def Extracted_data(name):
    copy = False
    res_data = "";  # This will build a data string
    for data in name:
        if not (data.startswith ("title")): # As you wanted nothing except title data
            copy = False             
        else:                               # It will only get "title"
            copy = True
            res_data += data                # And append it to the result
    return res_data

要点:

您需要在以合理的方式离开循环后返回数据。还要记住,一旦你输入了这个函数,你就会得到copy = False - 这现在可能没关系,但只是礼貌地提醒你今后使用这种方法做什么扩展。

答案 2 :(得分:0)

虽然可能有更好的解决方法,但这样做会有所帮助。正如furkle所说,if - else语句没有正确使用,我添加了一个结果变量来存储临时值。

   def Extracted_data(name):
    copy = False
    result = ""
    for data in name:
        if (data.startswith ("title") or data.startswith ("date") or data.startswith ("time") or data.startswith ("table")):
            copy = True
        else:
            copy = False

        if copy and not data is None:
            result += data 

    return result

name = open ("file.txt").readlines()
def a():
    data = Extracted_data(name)
    print (data)

a()