2012-10-21 20 views
7

Mam plik tekstowy z kolumnami danych i muszę zmienić te kolumny w oddzielne listy lub tablice. To, co mam tak dalekoUżywanie readlines w pythonie? Po raz pierwszy

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

Kiedy uruchamiam to mam IndexError: list index out of range.

fragment poniższe dane:

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 

muszę pierwszą kolumnę, w miarę możliwości, aby wyglądać następująco: danych = [16, 17, 18, 20, 21, 22, 24, 25, 26]

+4

['csv'] (http://docs.python.org/library/csv.html) jest twoim przyjacielem. –

+1

... nie powinno to być "dla wiersza w f.readlines():' lub bardziej po prostu 'dla wiersza w f'? – nneonneo

Odpowiedz

5

Otrzymujesz pustą listę Data=[], jeśli czytasz pusty wiersz. Próbujesz pobrać pierwszy element z listy, używając Data[0], ale ponieważ jest to pusta lista, nie ma elementu na pozycji 0, więc otrzymasz 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 

To wydrukować Data jeżeli IndexError occours - można zobaczyć siebie, że drukuje pustą listę:

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

można użyć oświadczenie with do otwarcia pliku, który automatycznie zamyka plik po przetworzeniu. Możesz także przechwytywać sam plik, bez używania 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: Lepiej z wykorzystaniem modułu 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

Dziękuję bardzo za opinie i sugestie. Czy istnieje sposób, że mogę następnie pobrać dane do postaci listy w następujący sposób: Data = [0, 1, etc]? – user1762768

+0

Po prostu próbuję przenieść dane do listy, ponieważ muszę użyć jej do wykonania interpolacji liniowej. Jeśli użyję ostatniej sugerowanej metody, (używając "z"), to dasz mi listę, którą będę mógł później wykorzystać w mojej interpolacji? 0,1, itd. Były przykładami importowanych wartości danych – user1762768

+0

jeśli chcesz użyć interpolacji spójrz na bibliotekę pand (możesz importować dane dirctly z csv), oto przykład interpolacji z użyciem pand jako odpowiedź na poprzednie pytanie http://stackoverflow.com/questions/12982792/interpolate-number-sequence/12983037#12983037 – root

2

korzystanie z za filehandlers.

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

you Błąd indeksu pochodzi z próby dostępu Data w miejscu [0]. co oznacza po prostu, że linia była pusta.

należy przeprowadzić szybki test przed parsowania linii ...

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

W Pythonie lepiej napisać 'if len (Data):', a nie 'if len (Data)> 0:'. –

+0

@ Burhan Khalid - nie możesz po prostu zrobić, jeśli Dane :? – root

+0

@root nie, ponieważ pusta lista nadal istnieje. '>>> a = []' '>>> print a'' [] ' –

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

Mam nadzieję, że to rozwiąże problem.

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 do b def SAVEFILE(): plik = open ("matrix2.txt", "w") file.write ("matrixB \ n" + string_final + "\ nx" + str (num) + "\ nn:" + str (n) + "\ ntotal:" + str (tot)) file.close(); x = 1 gdy x == 1: getInput() if (<=0 or n> n = 20): #check do druku n "wchodzi prawidłowy N" przerwa if (len (matrix_1) = n * n lub len (set (matrix_1))! = len (matrix_1)): # sprawdź czy wejście jest poprawne czy nie drukuj "błędne wejście" zerwanie if (set ([99> a> 9 dla a in matrix_1 ])! = {True}): # sprawdź wartość n wydrukuj "wprowadź odpowiedni numer" przerwij show() saveFile() x = x + 1; – user4816019

+0

Komentarze niszczą formatowanie kodu, szczególnie w językach znaczących. Proszę [edytuj] swoją odpowiedź, aby dołączyć dodatkowy kod. –

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 Dodaj zero # def cal(): lista1 = []; dla wiersza w zakresie (1, n + 1): dla kolumny w zakresie (1, n + 1): tot = 0; count = 0; dla m w zakresie (-1,2): dla p w zakresie (-1,2): jeśli (num_list [wiersz + m] [col + p] == 0): count = count + 1; tot = tot + num_list [wiersz + m] [col + p]; if (count! = 0): tot = tot/(9-count); else: tot = tot/9 list1.append (str (tot) + ""); list1.append ("\ n"); wydrukuj "" .join ([str (a) dla a na liście1]) – user4816019

+0

x = 1; podczas gdy x == 1: num_list, n = get(); jeśli (n> 20 lub n <3): drukuj "n powinien między 3 a 20" zerwanie jeśli (b_no!= 0): wydrukuj "wprowadź poprawnie" przerwij cal() x = x + 1; – user4816019

+1

Wiesz, istnieje opcja * * edit, prawda? – livibetter

0

by uniknąć stosując danych [0], lub rząd [0], zamiast tego byłoby użyć '' .join (dane) lub '' .join (wiersz), aby uniknąć pusty lista (indeks listy poza zakresem błędu).

Powiązane problemy