2012-10-21 86 views
7

我有一個數據列的文本文件,我需要把這些列變成單個列表或數組。 這是我迄今爲止在python中使用readlines?第一次

f = open('data.txt', 'r') 
temp = [] 
for row in f.readlines(): 
    Data = row.split() 
    temp.append(float(Data[0])) 

當我運行此我得到IndexError: list index out of range

下面的數據的片段:

16 0.2000 
17 0.3000 
18 0.4000 
20 0.5000 
21 0.6000 
22 0.7000 
24 0.8000 
25 0.9000 
26 1.000 

我需要的第一列,如果可能看起來像這樣: 數據= [16,17,18,20,21,22,24,25, 26]

+4

['csv'](http://docs.python.org/library/csv.html)是你的朋友。 –

+1

...不應該爲f.readlines()中的行:'或者更簡單地'爲f中的行嗎? – nneonneo

回答

5

如果您讀取空行,您將得到一個空列表Data=[]。您嘗試使用Data[0]從列表中獲取第一個元素,但由於它是空列表,因此它在位置0處沒有元素,因此您會得到IndexError

Data=''.split() 

Data[0] 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-686-0792b03cbbdf> in <module>() 
----> 1 Data[0] 

IndexError: list index out of range 

這將打印出Data如果IndexError occours - 你可以看到自己,它打印一個空列表:

f=open('file','r') 
temp = [] 
for row in f.readlines(): 
    Data = row.split() 
    try: 
     temp.append(float(Data[0])) 
    except IndexError: 
     print Data 

可以使用with語句來打開文件時,自動關閉文件處理完畢後。您也可以循環播放文件本身,而無需使用readlines()

with open(file,'r') as f:   
    for row in f: 
     Data = row.split() 
     try: 
      print Data[0] 
     except IndexError: 
      print 'You have an empty row' 

編輯:您是使用CSV模塊的更好:

import csv 
with open('file.csv', 'rb') as f: 
    reader = csv.reader(f, delimiter=' ') 
    print [row[0] for row in reader if len(row)] 
>>> 
['16', '17', '18', '20', '21', '22', '24', '25', '26'] 
+0

非常感謝您的反饋和建議。有沒有一種方法可以將數據轉換爲像這樣的列表形式:Data = [0,1等]? – user1762768

+0

我只是想把數據放到列表中,因爲我需要使用它來執行線性插值。如果我使用你建議的最後一種方法,(使用'with')是否會給我一個列表,以便稍後用於插值? 0,1等分別被導入 – user1762768

+0

,如果你想使用插值看看大熊貓庫(它可以導入消法從CSV數據)的數據值只是一個例子,這是一個使用熊貓作爲一個插值例回答以前的問題http://stackoverflow.com/questions/12982792/interpolate-number-sequence/12983037#12983037 – root

2

與filehandlers使用。

with open('path/to/file', 'r') as f: 
    for line in f: 
     # code. 

您指數誤差來自試圖在[0]位置訪問Data。 這只是表示你的行是空的。

你應該分析前行運行快速檢查...

if len(Data): 
    #code 
else: 
    #empty line? 
+1

在Python中,最好編寫'if len(Data):'而不是'if len(Data)> 0:'。 –

+0

@布爾漢哈立德 - 你不能那麼做,如果數據:? – root

+0

@root否,因爲空列表仍然存在。 '>>> A = []''>>>打印了''[]' –

0
f = open('data.txt', 'r') 
temp = [] 
for row in f.readlines(): 
    items = row.split(',') 
    temp.append(unicode(items[0])) 

我希望它可以解決你的問題。

0
def cal(num_list): 
    x = 1; 
    z = 0; 
    while True: 
     list1 = list(str(x)) 
     list2 = [int(a) for a in list1] 

     for i in range(len(list2)): 
      for j in range(10): 
       if(list2.count(j) > num_list[list2[i]]): 
        z = 1; 
        break; 
     if(z == 1): 
      save(x); 
      break;  
     x = x + 1; 
0
#matrix A to B 
def show(): 
    global string_final,list_2,tot 
    index=matrix_1.index(num) # finding index of num 

    length=n 
    j=(index)%length # the column positon 
    i=index/length # the row position 

    list_1=[] 
    for a in range(length): 
     lis=[] 
     for b in range(length): 

      lis.append(matrix_1.pop(0)) #pop the first element and append the list 

     list_1.append(lis) 

    tot=0 
    list_2=[] 

    for a in range(i+1): 
     for b in range(j+1): 
      tot=tot+list_1[a][b] # add the numbers 
      list_2.append(list_1[a][b]) #append to list 
      if(b!=length): 
       list_2.append(" ") #append space 
     list_2.append("\n") 
    string_final="".join([str(a) for a in list_2]) #list to string 


    print "matrix B\n",string_final,"\nx: ",str(num),"\nn: ",str(n)+"\ntotal: "+str(tot) # print the result 
+0

#mat A到b DEF saveFile的(): 文件=打開( 「matrix2.txt」, 「W」) file.write( 「matrixB \ n」 + string_final + 「\ NX:」 + str(num)+「\ nn:」+ str(n)+「\ ntotal:」+ str(tot)) file.close(); X = 1 而X == 1: getInput() 如果(N <=0 or n> = 20):#檢查爲n個 打印 「輸入正確的N」 破 IF(LEN(matrix_1)= N * N或LEN(集(matrix_1))= LEN(matrix_1)):#檢查輸入的好不好 打印 「輸入錯誤」 破 如果(對於在matrix_1集([99> A> 9 ])#= {True}):#檢查n的值 print「enter suitable number」 break show() saveFile() x = x + 1; – user4816019

+0

註釋破壞代碼格式,特別是在空白顯示語言中。請[編輯]您的答案以包含附加代碼。 –

0
#matrix add zero 
def get(): 
    global b_no 
    num_list=[]; 
    file=open("matrix.txt","r"); 
    for i in file: 
     b_no=0 
     if(len(i.split())==1): #check length is 1 or not 
      n=int(i)#string to int 
     else: 
      temp=i.split(); 
      if(len(temp)!=n): 
       b_no+=1 
       break 
      temp=[0]+[int(a) for a in temp]+[0] #add zero at first and last 
      num_list.append(temp); 

    zero_list=[] 

    for i in range(n+2): 
     zero_list.append(0)   #append zero 
    num_list.insert(0,zero_list) 
    num_list.insert(n+1,zero_list) 
    return num_list,n; 
+0

#mat add zero#def cal(): list1 = []; 有效範圍內的行(1,N + 1): 有效範圍內的欄(1,N + 1): TOT = 0; count = 0;對於範圍(-1,2)中的m: 對於範圍(-1,2)中的p: 如果(num_list [row + m] [col + p] == 0): count = count + 1; tot = tot + num_list [row + m] [col + p]; if(count!= 0): tot = tot /(9-count); 否則: TOT = TOT/9 list1.append(STR(TOT)+」「); list1.append(「\ n」); print「」.join([str(a)for a in list1]) – user4816019

+0

x = 1; 而x == 1: num_list,n = get(); 如果(N> 20或正<3): 打印 「n應3和20之間的」 如果(b_no 破 != 0): print「enter correctly」 break cal() x = x + 1; – user4816019

+1

你知道有一個*編輯*選項,對嗎? – livibetter

0

我會避免使用Data [0]或行[0],相反,我會用 ''。加入(數據)或 ''。加入(行),以避免空列表(列表索引超出範圍錯誤)。