2017-01-28 53 views
0

我有一個函數,我想讀取一個文件並從中返回多個值,儘管我無法理解這將如何工作。例如,如果我的文本文件看起來像這樣:從python中的文本文件返回多行

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

這裏是發電機的解決方案。 yield如果文件很大,則文件的每一行都可能派上用場。這可以防止整個文件被讀入內存。

然後在for循環中處理該文件的內容。

還注意到with聲明打開文件。這需要關閉它(即使程序崩潰)並且是從文件讀取的python方式。

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) 

我冒昧地投valueint。不知道這是否是對你有用...

如果您需要更改的行/列,那麼你必須閱讀所有的內存,你可以這樣:

data = [(names, values) for names, values in function()] 
names = [item[0] for item in data] 
values = [item[1] for item in data] 

然後你可以很-print用:

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 
+0

嗨,如果我不得不通過一個單獨的函數返回另一列? – DrMoe

+0

@DrMoe你是指我稱之爲'價值'的人?你可以使用相同的函數,只需要「yield value」。 –

+0

但是,如果我這樣做不會第二個列表只是打印另一個?如果想要並排打印呢? – DrMoe

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) 
+0

我明白了。因此,然後通過主函數傳遞它,我不得不遍歷列表以列格式打印它,對吧? – DrMoe

+0

但是,如果我想爲兩個柱子做同樣的操作,並將它們放在同一條線上,該怎麼辦?如果我這樣做,就像上面顯示的方式不會在第一列之後出現第二列?這是假設我假設我不得不使用第二個函數返回第二列 – DrMoe