2012-02-19 141 views
3

我在下面的函數中遇到問題。這似乎分割文件不錯,但那麼只有返回它作爲一個元素Python將文件分割成列表

功能:

def splitRoute(): 
    route = [] 
    for line in open("route.txt","r").readlines(): 
    line = line.replace("\r","") 
    line = line.replace("\n","") 
    line = string.split(line, '>') 
    route.append(line) 
    return route 

輸出:

[['B', 'F']] 

route.txt內容:

B>F 

是它只返回一個元素,因爲文件中只有一行? 我有另一個功能,將另一個文件拆分爲7x7列表,該列表可以正常工作,但由於它有7行,因此只能達到所有7個元素。

+0

那麼,還有什麼是你期待? – 2012-02-20 02:41:48

回答

3

你爲什麼要更換換行符?只需拆分字符串:

def splitRoute(): 
    route = [] 

    for line in open('route.txt', 'r'): 
    route.append(line.strip().split('>')) 

    return route 
+0

非常感謝。 – 2012-02-19 20:21:12

+1

@Schmooo,每次使用'+'時它都會創建一個新的列表副本。我建議使用'extend'而不是'append';那麼你根本不需要使用'sum'。 – senderle 2012-02-19 20:23:15

+0

@senderle我更換了謝謝。 – 2012-02-19 20:28:27

1

split創建一個列表。然後你append列表到另一個(空)列表。所以結果是你在列表中獲得一個列表。如果你有更多的線路,你會得到一個更長的列表清單。下面的代碼的快速崩潰:

def splitRoute(): 
    route = [] 

您創建一個空列表...

for line in open("route.txt","r").readlines(): 
    line = line.replace("\r","") 
    line = line.replace("\n","") 

對於每一行,你替換\ r和\ n個字符用空字符串。請注意,您可以使用line.strip()'apple\n\r'.strip() - >'apple')更容易地執行此操作。另外,您應該將文件保存到文件名,以便稍後關閉它。最後,您不需要在這裏使用readlines - 只需直接遍歷文件即可。

line = string.split(line, '>') 

現在你採取line指字符串,它分割成一個列表,並將列表分配給line。現在line看起來像這樣:['B', 'F']

route.append(line) 
    return route 

現在你已經追加到lineroute,並route如下:[['B', 'F']]

如果您的目標是創建單個列表,請使用extend而不是append

def splitRoute(): 
    route = [] 
    f = open('route.txt', 'r') 
    for line in f: 
    route.extend(line.strip().split('>')) 
    f.close() 
    return route 

或者,使用with,並採用更具可讀性縮進級別:

def splitRoute(): 
    route = [] 
    with open('route.txt', 'r') as f: 
     for line in f: 
      route.extend(line.strip().split('>')) 
    return route 

輸出,用於兩行的文件('B>F\nF>X\n'):

>>> splitRoute() 
['B', 'F', 'F', 'X'] 
+0

我是否需要列表中的列表才能使其成爲二維數組,或者是否有一種方法可以使用一個列表完成此操作? – 2012-02-19 21:20:41

+0

如果你想要一個2D數組,使用'append'而不是'extend'。用Python創建二維數組最直接的方法就是創建一個列表列表。你也可以用元組索引字典; 'd = {}; d [0,0] = 1; d [0,1] = 0; d [1,0] = 1; d [1,1] = 0,依此類推。但是在大多數情況下,這比列表列表要慢一些。 – senderle 2012-02-19 22:26:01