2012-10-21 13 views
7

Ho un file di testo con colonne di dati e ho bisogno di trasformare queste colonne in singoli elenchi o matrici. Questo è ciò che ho finoraUtilizzo di readlines in python? Prima volta

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

Quando ho eseguito questo ho IndexError: list index out of range.

frammento dei dati indicati

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 

devo prima colonna, se possibile simile a questa: dati = [16, 17, 18, 20, 21, 22, 24, 25, 26]

+4

['csv'] (http://docs.python.org/library/csv.html) è tuo amico. –

+1

... non dovrebbe essere 'per riga in f.readlines():' o più semplicemente 'per riga in f'? – nneonneo

risposta

5

Si ottiene una lista vuota Data=[] se si legge una riga vuota. Si tenta di ottenere il primo elemento dall'elenco utilizzando Data[0], ma poiché è un elenco vuoto non ha un elemento in posizione 0, quindi si ottiene un 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 

Questo stamperà i Data se IndexError occours - potete vedere voi stessi che stampi una lista vuota:

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

È possibile utilizzare l'istruzione with per aprire il file, che chiude automaticamente il file dopo essere stato elaborato. Inoltre è possibile eseguire il looping del file stesso, senza utilizzare 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' 

EDIT: Sei meglio di utilizzare il modulo 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

Grazie mille per i vostri commenti e suggerimenti. C'è un modo in cui posso quindi ottenere i dati in una forma di lista come questa: Dati = [0, 1, ecc.]? – user1762768

+0

Sto solo cercando di ottenere i dati in un elenco perché è necessario utilizzarlo per eseguire un'interpolazione lineare. Se uso l'ultimo metodo che hai suggerito, (usando 'with') mi darà una lista che posso usare successivamente nella mia interpolazione? 0,1, ecc. Erano solo esempi dei valori dei dati importati – user1762768

+0

se si desidera utilizzare l'interpolazione dare un'occhiata alla libreria pandas (può importare i dati direttamente da csv), ecco un esempio di interpolazione usando panda come rispondere a una domanda precedente http://stackoverflow.com/questions/12982792/interpolate-number-sequence/12983037#12983037 – root

2

uso con per file handler.

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

si errore di indice viene dal tentativo di accedere Data nella posizione [0]. che significa semplicemente che la tua linea era vuota.

si dovrebbe eseguire un controllo veloce prima analisi della riga di ...

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

In Python, è meglio scrivere 'se len (Dati):' e non 'se len (Dati)> 0:'. –

+0

@ Burhan Khalid - non puoi fare altro se i dati :? – root

+0

@root no, perché esiste ancora una lista vuota. '>>> a = []' '>>> stampa a'' [] ' –

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

Spero che risolve il problema.

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 a B def saveFile(): file = open ("matrix2.txt", "w") file.write ("matriceB \ n" + string_final + "\ nx:" + str (num) + "\ nn:" + str (n) + "\ ntotale:" + str (tot)) file.close(); x = 1 mentre x == 1: getInput() if (n <=0 or n> = 20):! #check per il n di stampa "entrare corretta n" pausa se (len (matrix_1) = n * n o len (set (matrix_1))! = len (matrix_1)): # controlla che l'input sia ok o no stampa "input errato" break if (set ([99> a> 9 per a in matrice_1 ])! = {True}): # controllare il valore di n stampa "inserisci numero adatto" interruzione show() saveFile() x = x + 1; – user4816019

+0

I commenti distruggono la formattazione del codice, in particolare nelle lingue significative dello spazio bianco. Si prega di [modificare] la risposta per includere il codice aggiuntivo. –

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 Aggiungi zero # def cal(): list1 = []; per intervallo di righe (1, n + 1): per intervallo di ricezione (1, n + 1): tot = 0; conteggio = 0; per m nell'intervallo (-1,2): per p nell'intervallo (-1,2): if (num_list [riga + m] [col + p] == 0): conteggio = conteggio + 1; tot = tot + num_list [row + m] [col + p]; if (count! = 0): tot = tot/(9-count); else: tot = tot/9 list1.append (str (tot) + ""); list1.append ("\ n"); stampa "" .join ([str (a) per a in elenco1]) – user4816019

+0

x = 1; while x == 1: num_list, n = get(); se (n> 20 o n <3): stampa "n dovrebbe tra 3 e 20" interruzione se (b_no!= 0): stampa "immettere correttamente" interruzione cal() x = x + 1; – user4816019

+1

Sai che esiste un'opzione * edit *, giusto? – livibetter

0

avrei evitare l'uso di dati [0] o riga [0], invece, userei '' .join (Data) o '' .join (riga) per evitare vuoti lista (elenco indice di errore fuori intervallo).

Problemi correlati