2013-12-22 40 views
1

基本上我想從文本文件中讀取字符串,並將它們放入列表中,然後將三個列表放入另一個列表中。其實讓我解釋一下更好:)Python - 將字符串導入到列表中,轉換爲另一個列表:)

文本文件(只是一個例子,我可以構建它,但是我想):

party  
sleep 
study  
-------- 
party 
sleep 
sleep  
----- 
study 
sleep 
party 
--------- 

由此,我想Python來創建一個列表看起來像這樣:

List1 = [['party','sleep','study'],['party','sleep','sleep'],['study','sleep','party']etc] 

但它是超級艱難。我正在試驗類似的東西:

test2 = open('test2.txt','r') 
List=[] 

for line in 'test2.txt': 
    a = test2.readline() 
    a = a.replace("\n","") 
    List.append(a) 
    print(List) 

但是,這只是可怕的可怕的事情。如何實現這一目標?

+1

這是一個臨時櫃檯,你要麼在:)重置或使用模量的一個典型案例。 – 2013-12-22 14:48:29

+2

爲了清楚起見,文本文件中實際上有幾行,例如, '--------'你想充當列表之間的分隔符? – ChrisProsser

+0

好吧,我把它們放在那裏,否則,要知道在哪裏結束一個序列並開始一個新序列是非常困難的,不是嗎? :o但是我都很樂於提供如何以良好的方式構建文本文件的建議! – imfromsweden

回答

3

你可以用這個嘗試:

res = [] 
tmp = [] 

for i, line in enumerate(open('file.txt'), 1): 
    tmp.append(line.strip()) 
    if i % 3 == 0: 
     res.append(tmp) 
     tmp = [] 

print(res) 

我假設你沒有短劃線ES。

編輯:

這裏是當你有破折號的例子:

res = [] 
tmp = [] 

for i, line in enumerate(open('file.txt')): 
    if i % 4 == 0: 
     res.append(tmp) 
     tmp = [] 
     continue 
    tmp.append(line.strip()) 

print(res) 
+0

從行的開始和結束刪除空白空間和''\ n''字符很簡單: ) – 2013-12-22 14:52:01

+0

不錯的清潔解決方案 – ChrisProsser

+0

哦,謝謝你太棒了!我只理解它的一半,但是哦:D我發現你已經將文本文件從「-----」中刪除了嗎?如果是這樣,將很難跟蹤一個序列開始和下一個結束的位置。假設你希望能夠在文本文件中輕鬆地編輯這三個序列,可能會非常煩人,不知道從哪裏開始,另一個結束:)有沒有什麼辦法可以使用,即使是在序列? 非常感謝btw! – imfromsweden

4

如果要將數據分組大小爲3。假設您的文本文件中的數據未被任何分隔符分組。

您需要按順序讀取文件並創建一個列表。到組,你可以使用任何已知的grouper algorithms

from itertools import izip, imap 
with open("test.txt") as fin: 
    data = list(imap(list, izip(*[imap(str.strip, fin)]*3))) 

pprint.pprint(data) 
[['party', 'sleep', 'study'], 
['party', 'sleep', 'sleep'], 
['study', 'sleep', 'party']] 

步驟的執行

  1. 與文件對象創建上下文管理。
  2. 剝去每一行。 (刪除新行)
  3. 尺寸3的迭代器列表上的使用拉鍊,確保了項目被作爲三個項的元組分組
  4. 轉換元組列出
  5. 轉換髮電機表達式列表。

考慮到所有的都是生成器表達式,它在單次迭代中完成。

相反,如果你的數據被分離並通過分隔符分組------可以使用itertools.groupby解決方案執行

  1. from itertools import imap, groupby 
    class Key(object): 
        def __init__(self, sep): 
         self.sep = sep 
         self.count = 0 
        def __call__(self, line): 
         if line == self.sep: self.count += 1 
         return self.count 
    
    
    with open("test.txt") as fin: 
        data = [[e for e in v if "----------" not in e] 
         for k, v in groupby(imap(str.strip, fin), key = Key("----------"))] 
    
    
    pprint.pprint(data) 
    [['party', 'sleep', 'study'], 
    ['party', 'sleep', 'sleep'], 
    ['study', 'sleep', 'party']] 
    

    步驟創建一個重點班,以增加當遇到分隔符時,就會有一個計數器。除了有條件地增加計數器外,該函數每次調用時都會吐出計數器。

  2. 使用文件對象創建上下文管理器。
  3. 剝去每一行。 (刪除換行符)
  4. 使用itertools.groupby並使用您的自定義密鑰對數據進行分組
  5. 從分組數據中刪除分隔符並創建組列表。
0

第一大問題:

for line in 'test2.txt': 

給你

't', 'e', 's', 't', '2', '.', 't', 'x', 't' 

您可以通過打開該文件需要循環:

for line in test2: 

或者,更好:

接下來,你需要做兩件事情之一:

  1. 如果行包含"-----",創建一個新的子列表(myList.append([])
  2. 否則,行追加到最後一個子列表在你的清單中(myList[-1].append(line)

最後,你的print最後不應該這麼縮進;目前,它可以打印每一行,而不僅僅是處理完成時。

List.append(a) 
print(List) 

也許爲您的文件一個更好的結構將是:

party,sleep,study 
party,sleep,sleep 
... 

現在每一行是一個子列表:

for line in f: 
    myList.append(line.split(',')) 
+0

很好的答案,非常感謝!我其實大部分這個帖子其實都明白,哈哈:D你的建議保持結構爲派對,睡覺,研究 睡覺,學習,睡眠 真的很好喝。唯一的問題是,我在列表中得到一個「\ n」,因爲我改變了這一行(我認爲這是行不通的,因爲你應該能夠輕鬆地判斷三個序列中哪一個開始,哪裏結束!),我認爲這可能會導致一些問題。我嘗試使用替換(「\ n」,「」)函數,但是Python沒有任何功能。不知道爲什麼TBB,它有它的時期似乎:) – imfromsweden

+0

您可以使用'line = line.strip()' – jonrsharpe