我有一个函数,我想读取一个文件并从中返回多个值,虽然我很难理解这是如何工作的。例如,如果我的文本文件如下所示:
John 2543
Jack 2453
Henry 3672
Jane 2405
Terry 9863
我的代码是这样的:
def function():
file = open('file.txt')
for lines in file:
name, number = lines.split(' ')
return name
def main():
print(function())
main()
这只返回一行中的名称,其中我想要整个第一列。我明白,如果我做了一个打印功能,而不是返回一个可以工作的功能。但是,在这种情况下,我想返回值,以便我可以将它们与我的其他函数一起使用。谢谢。
编辑:
我还有一个跟进问题,就是如何在为每列专用功能的同时并排打印两列。通常,当我一个接一个地打印一列时,它将显示为:
John
Jack
Henry
Jane
Terry
2543
2453
3672
2405
9863
当我希望它们显示为:
John 2543
Jack 2453
Henry 3672
Jane 2405
Terry 9863
答案 0 :(得分:0)
当你返回一个值时,函数结束并且控制立即返回到调用它的函数。所以当你在循环内部返回时,你不会在函数退出之前多次执行循环并将其返回值交给调用函数。
您需要先构建整个列表,然后返回它。
def function():
with open('file.txt') as file:
names = []
for line in file:
names.append(line.split()[0])
return names
或
def function():
with open('file.txt') as file:
return [line.split()[0] for line in file]
并像这样使用它:
def main():
for name in function():
print(name)
答案 1 :(得分:0)
这是一个带发电机的解决方案。如果您的文件很大,yield
文件的每一行都可以派上用场。这可以防止整个文件被读入内存。
然后在for
循环中处理文件的内容。
还要注意with
语句以打开文件。这需要关闭它(即使程序崩溃)并且是从文件中读取的pythonic方式。
def function():
with open('file.txt') as file:
for line in file:
name, value = line.split()
value = int(value)
yield name, value
# here you can do what you need to for all the data in the file
for name, value in function():
print(name, value)
我冒昧地将value
投射到int
。不知道这对你有用......
如果你需要更改行/列,那么你必须阅读所有内存,你可以这样做:
data = [(names, values) for names, values in function()]
names = [item[0] for item in data]
values = [item[1] for item in data]
然后你可以用以下方式打印出来:
separator = '|'
name_lst = ['{:6s}'.format(name) for name in names]
value_lst = ['{:<6d}'.format(value) for value in values]
# join the lists to str
print(separator.join(name_lst))
print(separator.join(value_lst))
# John |Jack |Henry |Jane |Terry
# 2543 |2453 |3672 |2405 |9863