我试图编写一个从文本文件中获取数据的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
我该如何解决这个问题?我哪里错了?
答案 0 :(得分:0)
两点:
首先,data
是在您遍历name
时不断更新的值。该变量(除非您在循环中重新定义它,您不应该这样)将始终定义为您当前从name
读取的行,因此返回data
将始终只返回一行
其次,你使用if-elif
条件的方式似乎有点奇怪。只有在所有先前的elif
和if
语句都被评估为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()