2012-10-21 6 views
7

Ich habe eine Textdatei mit Datenspalten und ich muss diese Spalten in einzelne Listen oder Arrays verwandeln. Dies ist, was ichVerwenden von Readlines in Python? Erste Mal

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

bisher habe Wenn ich das ich IndexError: list index out of range bekommen laufen.

Snippet der Daten unter:

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 

muss ich die erste Spalte, wenn möglich, wie folgt aussehen: Data = [16, 17, 18, 20, 21, 22, 24, 25, 26]

+4

['csv'] (http://docs.python.org/library/csv.html) ist dein Freund. –

+1

... sollte das nicht 'für row in f.readlines():' oder einfacher 'für row in f' sein? – nneonneo

Antwort

5

Sie erhalten eine leere Liste Data=[], wenn Sie eine leere Zeile lesen. Sie versuchen, das erste Element aus der Liste mit Data[0] zu erhalten, aber da es eine leere Liste ist, hat es kein Element an Position 0, so erhalten Sie eine 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 

Dieses aus den Data wenn IndexError occours drucken - Sie können selbst sehen, dass es eine leere Liste druckt:

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

Sie können die with Anweisung verwenden, um die Datei zu öffnen, das schließt sich automatisch die Datei nach der Verarbeitung. Sie können auch die Datei selbst durchlaufen, ohne readlines() zu verwenden.

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: Sie sind besser, die CSV-Modul verwenden:

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

Vielen Dank für Ihr Feedback und Anregungen. Gibt es einen Weg, wie ich dann die Daten in eine Listenform wie diese bekommen kann: Daten = [0, 1, etc]? – user1762768

+0

Ich versuche nur, die Daten in eine Liste zu bekommen, weil ich sie dann verwenden muss, um eine lineare Interpolation durchzuführen. Wenn ich die letzte vorgeschlagene Methode benutze (mit 'mit'), bekomme ich dann eine Liste, die ich später in meiner Interpolation verwenden kann? Die 0,1 usw. waren nur Beispiele für die importierten Datenwerte – user1762768

+0

Wenn Sie Interpolation verwenden möchten, werfen Sie einen Blick auf die Pandas-Bibliothek (es kann die Daten direkt aus CSV importieren), hier ist ein Interpolationsbeispiel mit Pandas als antworte auf eine vorherige Frage http://stackoverflow.com/questions/12982792/interpolate-number-sequence/12983037#12983037 – root

2

Verwendung mit für Filehandler.

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

Sie Indexfehler kommt von dem Versuch Data am [0] Standort zuzugreifen. was einfach bedeutet, dass Ihre Leitung leer war.

Sie sollten eine schnelle Überprüfung vor Parsen der Linie laufen ...

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

In Python ist es besser, 'if len (Daten):' und nicht 'if len (Daten)> 0:' zu schreiben. –

+0

@ Burhan Khalid - können Sie dann nur tun, wenn Daten :? – root

+0

@root nein, weil eine leere Liste noch existiert. '>>> a = []' '>>> drucken a'' [] ' –

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

Ich hoffe, dass es Ihr Problem löst.

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 def savefile() b: file = open ("matrix2.txt", "w") file.write ("MatrixB \ n" + string_final + "\ nx:" + str (num) + "\ nn:" + str (n) + "\ ngesamt:" + str (tot)) file.close(); x = 1 während x == 1: GetInput() if (n <=0 or n> = 20): #check für den n print "eingeben richtig n" Pause if (len (matrix_1) = n * n oder len (set (matrix_1))! = len (matrix_1)): # prüfen, ob die Eingabe in Ordnung ist oder nicht "falschen Eingang" drucken break if (set ([99> a> 9 für a in matrix_1 ])! = {True}): # Überprüfen Sie den Wert von n print "geeignete Zahl eingeben" brechen show() saveFile() x = x + 1; – user4816019

+0

Kommentare zerstören die Codeformatierung, insbesondere in whitespace-signifikanten Sprachen. Bitte [bearbeiten] Sie Ihre Antwort, um den zusätzlichen Code hinzuzufügen. –

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 Null hinzufügen # def cal(): list1 = []; für Reihe im Bereich (1, n + 1): für col im Bereich (1, n + 1): tot = 0; zählen = 0; für m im Bereich (-1,2): für p im Bereich (-1,2): if (Anzahl_Liste [Zeile + m] [Spalte + P] == 0): Anzahl = Anzahl + 1; tot = tot + num_list [Reihe + m] [col + p]; if (count! = 0): tot = tot/(9-Zählung); sonst: tot = tot/9 list1.append (str (tot) + ""); list1.append ("\ n"); drucken "" .join ([str (a) für a in list1]) – user4816019

+0

x = 1; während x == 1: num_list, n = get(); if (n> 20 oder n <3): print "n sollte zwischen 3 und 20" brechen if (b_no!= 0): drucken "richtig eingeben" brechen cal() x = x + 1; – user4816019

+1

Sie wissen, dass es eine Option * edit * gibt, richtig? – livibetter

0

ich vermeiden würde mit Hilfe von Data [0] oder row [0], stattdessen würde ich '' .join (Data) oder '' .join (Zeile) verwendet leer zu vermeiden Liste (Listenindex außerhalb des Bereichsfehler).

Verwandte Themen