2013-08-21 203 views
0

一種程序,在導入期間還原陣列單行寫入列表爲.txt文件以下列方式:的Python:從.txt文件

[ 3. 6. 3. 1. 1. 1. 0. 1. 2. 2. 9. 2. 5. 2. 2. 1. 0. 0. 
    4. 6. 1. 1. 1. 0. 5. 2. 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 4. 9. 8. 7. 2. 4. 1. 7. 5. 3. 7. 2. 6. 0. 9. 
    5. 6. 10. 6. 2. 1. 5. 0.] 
[ 3. 5. 9. 1. 1. 1. 0. 1. 1. 4. 8. 5. 5. 3. 3. 
    7. 6. 12. 9. 2. 1. 0. 0. 4. 6. 1. 1. 1. 0. 5. 
    0. 0. 0. 0. 0. 0. 0. 0. 0.] 

即,列表不是在一行上。我想爲這些列表中的每一個創建一個直方圖,在確保整個列表(而不是單個行)被導入後,如何在列表中導入這些列表中的整數值?我曾嘗試:

data = [line.strip() for line in open('n.txt', 'r')] 

但調用數據時,[0],它只是產生了頂線。有什麼建議麼?

+0

你可以使用'.append()'將所有列表追加到一個列表中,並將其寫入文本文件 – Tushar

+0

將嘗試,謝謝! – user2705476

回答

0

如果您正在控制對文件的寫入,則可以使用更簡單的格式來寫入此數據。但是,如果你堅持這一點,這裏的加載的一種方式:

import ast 

with open('test.txt', 'r') as f: 
    data = [] 
    curList = [] 
    for line in f: 
     line = line.replace('[', ' [ ').replace(']', ' ] ') 
     items = line.split() 
     for item in items: 
      if item == "[": 
       curList = [] 
      elif item == "]": 
       data.append(curList) 
      else: 
       curList.append(ast.literal_eval(item)) 

print data 

OUTPUT:

[[3.0, 6.0, 3.0, 1.0, 1.0, 1.0, 0.0, 1.0, 2.0, 2.0, 9.0, 2.0, 5.0, 2.0, 2.0, 1.0, 0.0, 0.0, 4.0, 6.0, 1.0, 1.0, 1.0, 0.0, 5.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
[4.0, 9.0, 8.0, 7.0, 2.0, 4.0, 1.0, 7.0, 5.0, 3.0, 7.0, 2.0, 6.0, 0.0, 9.0, 5.0, 6.0, 10.0, 6.0, 2.0, 1.0, 5.0, 0.0], 
[3.0, 5.0, 9.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 4.0, 8.0, 5.0, 5.0, 3.0, 3.0, 7.0, 6.0, 12.0, 9.0, 2.0, 1.0, 0.0, 0.0, 4.0, 6.0, 1.0, 1.0, 1.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]] 
0

原油,而應加入線路沒有所有的數據加載到內存在同一時間。

a_lines = list() 
str_line = '' 

for line in [l.rstrip() for l in open('data.txt')]: 
    str_line += line 
    if str_line[-1] == ']': 
     a_lines.append(str_line) 
     str_line = '' 

my_data = '\n'.join(a_lines) 

這裏有regex

import re 

p = re.compile(r'([^\]])\n', re.MULTILINE) 
my_data = '' 

with open('data.txt') as my_file: 
    my_data = p.sub(r'\1', my_file.read()) 

兩個代碼樣本保持數據在一個字符串元素,my_data

0

基於這樣的事實,一個新的名單是由[表示一種不同的方法:

data = [] 
with open("n.txt") as fh: 
    for line in fh: 
     line = line.replace('.', '').replace(']', '') 
     line = line.split() 
     if line[0] == '[': 
      data.append(map(int, line[1:])) 
     else: 
      data[-1].extend(map(int, line)) 

Dots被刪除,所以int稍後工作。它依賴於在每個[之後至少有一個空格(在您的簡短示例中這是真實的),但如果不是這樣,您可以輕鬆地進行調整,例如使用替代Brionius的答案。