【问题标题】:Return not returning full data python返回不返回完整数据python
【发布时间】:2014-11-17 08:35:57
【问题描述】:

我正在尝试编写一个 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

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

【问题讨论】:

    标签: python string function csv tsv


    【解决方案1】:

    两点:

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

    其次,您使用 if-elif 条件的方式似乎有点奇怪。 elif 只有在所有之前的 ifelif 语句都被评估为 false 时才会被评估,所以永远不会有 copy 设置为 true 并返回 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
    

    没有理由检查标题是否是您想要的 - 如果是,请将其复制到您的字符串中。我还对此进行了修改,以便您传入允许的标头列表,以防万一您想重用它以仅获得 titledate 或任何其他组合。

    【讨论】:

      【解决方案2】:

      尽管可能有更好的方法来解决它,但这会解决问题。正如 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()
      

      【讨论】:

      • 如果 data.startswith("Table") 复制为假 - 检查 OP 的代码。
      • 我同意,仅在预期输出表中包含。这就是为什么将其包含在列表中的原因。
      • @RikVerbeek 我的错!对不起。那是我的错误。感谢您的代码。我会试试看:)
      【解决方案3】:

      在代码中看我的cmets:

      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
      

      总结:

      退出for循环后需要以合理的方式返回数据。另请记住,您一进入函数就会收到copy = False - 现在可能无关紧要,但只是礼貌地提醒您将来使用此方法进行的任何扩展。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-14
        • 2021-04-29
        • 1970-01-01
        • 2013-07-03
        • 1970-01-01
        • 1970-01-01
        • 2021-08-06
        • 1970-01-01
        相关资源
        最近更新 更多