2016-11-10 22 views
0

我需要從我的輸入文件中讀取可變數量的列(列數由用戶定義,沒有限制)。對於每一列,我都有多個要讀取的變量,在我的情況下也是三個,由用戶設置。用Python讀取可變列數

所以讀取該文件是這樣的:

2 3 5 
6 7 9 
3 6 8 

在Fortran中,這是很容易做到:

DO 180 I=1,NMOD 
READ(10,*) QARR(I),RARR(I),WARR(I) 

NMOD由用戶自定義,以及在所有的值例。所有這些都是輸入參數存儲在內存中。通過這樣做,我可以保存所有我需要的變量,並且可以隨時使用它,通過更改I索引來回顧它們。我怎樣才能獲得與Python相同的結果?

回答

1

實施例文件 '文本'

2 3 5 
6 7 9 
3 6 8 

Python代碼

data = [] 

with open('text') as file: 
    columns_to_read = 1 # here you tell how many columns you want to read per line 
    for line in file: 
     data.append(list(map(int, line.split()[:columns_to_read]))) 

print(data) # print: [[2], [6], [3]] 

data將認爲代表你的線條數組的數組。

+0

兩個問題: 1)如何回憶我需要的變量?如果我只需要其中的一些,我該如何選擇這些? 2)我需要腳本讀取依賴於NMOD的列數。我也有其他的東西在文件中,我不想全部閱讀。它可行嗎? 非常感謝。 –

+0

你可以這樣做:'data [x] [y]',其中'x' =行數,'y' =列。因此,在這種情況下,data [2] [2]'將檢索數字「8」,最後一行和最後一個數字。 – JChris

+0

如果您需要忽略文件中的其他數據,則應該使用適當的文件示例更新您的問題,這樣人們在提供代碼時就會考慮到這一點。 – JChris

0
from itertools import islice 
with open('file.txt', 'rt') as f: 
    # default slice from row 0 until end with step 1 
    # example islice(10, 20, 2) take only row 10,12,14,16,18 
    dat = islice(f, 0, None, 1) 
    column = None # change column here, default to all 

    # this keep the list value as string 
    # mylist = [i.split() for i in dat] 
    # this keep the list value as int 
    mylist = [[int(j) for j for i.split()[:column] for i in dat] 

代碼上面構建2D列表

與MYLIST [行]訪問[柱]

實施例 - MYLIST [2] [3]的訪問行2列3

編輯 :使用@Guillaume @Javier建議提高代碼效率

+1

我會打開文件作爲文本文件,(在open()上顯式指定模式'rt'),然後使用readlines()。 – Guillaume

+0

@Guillaume謝謝,編輯使用readlines()的答案,我正在考慮換行符,但由於split()應該已經考慮到了它的冗餘。對於'rt'模式,我認爲它的罰款,因爲它默認與twxt讀取模式 – Skycc

+2

realines()不加任何東西,並提出使用內存。沒有該方法調用相同的代碼更好。 – Javier