2012-10-21 58 views
7

Tôi có một tệp văn bản với các cột dữ liệu và tôi cần phải chuyển các cột này thành các danh sách hoặc mảng riêng lẻ. Đây là những gì tôi có cho đến naySử dụng readlines trong python? Lần đầu tiên

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

Khi tôi chạy điều này, tôi nhận được IndexError: list index out of range.

Snippet của dữ liệu dưới đây:

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 

Tôi cần cột đầu tiên, nếu có thể trông như thế này: dữ liệu = [16, 17, 18, 20, 21, 22, 24, 25, 26]

+4

['csv'] (http://docs.python.org/library/csv.html) là bạn của bạn. –

+1

... không nên là 'cho hàng trong f.readlines():' hoặc đơn giản hơn 'cho hàng trong f'? – nneonneo

Trả lời

5

Bạn đang nhận được một danh sách trống Data=[] nếu bạn đọc một hàng trống. Bạn cố lấy phần tử đầu tiên từ danh sách bằng cách sử dụng Data[0], nhưng vì nó là một danh sách trống, nó không có phần tử ở vị trí 0, vì vậy bạn nhận được một 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 

này sẽ in ra Data nếu IndexError occours - bạn có thể nhìn thấy mình rằng nó in một danh sách trống:

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

Bạn có thể sử dụng câu lệnh with để mở tập tin, tự động đóng sau khi được xử lý. Ngoài ra, bạn có thể lặp lại chính tệp đó mà không cần sử dụng 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: Bạn đang tốt hơn của việc sử dụng các mô-đun 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

Cảm ơn rất nhiều vì phản hồi và đề xuất của bạn. Có cách nào để tôi có thể lấy Dữ liệu vào một danh sách như sau: Data = [0, 1, etc]? – user1762768

+0

Tôi chỉ đang cố gắng lấy dữ liệu vào danh sách vì tôi cần sử dụng nó để thực hiện nội suy tuyến tính. Nếu tôi sử dụng phương pháp cuối cùng bạn đề nghị, (sử dụng 'với') sẽ cho tôi một danh sách mà tôi có thể sử dụng sau này trong nội suy của tôi? 0,1, vv chỉ là ví dụ về giá trị dữ liệu được nhập – user1762768

+0

nếu bạn muốn sử dụng nội suy xem thư viện gấu trúc (nó có thể nhập dữ liệu dirctly từ csv), đây là ví dụ nội suy bằng cách sử dụng gấu trúc làm trả lời cho câu hỏi trước http://stackoverflow.com/questions/12982792/interpolate-number-sequence/12983037#12983037 – root

2

sử dụng với cho filehandlers.

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

lỗi chỉ mục của bạn xuất phát từ việc cố gắng truy cập Data tại địa chỉ [0]. chỉ đơn giản nghĩa là dòng của bạn trống.

bạn nên chạy một kiểm tra nhanh chóng trước khi phân tích các dòng ...

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

Trong Python, nó là tốt hơn để viết 'nếu len (dữ liệu):' và không 'nếu len (dữ liệu)> 0:'. –

+0

@ Burhan Khalid - không thể bạn sau đó chỉ cần làm nếu dữ liệu :? – root

+0

@root no, vì danh sách trống vẫn tồn tại. '>>> a = []' '>>> in a' '[]' –

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

Tôi hy vọng rằng nó giải quyết vấn đề của bạn.

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 đến b def saveFile(): tệp = mở ("matrix2.txt", "w") file.write ("matrixB \ n" + string_final + "\ nx:" + str (num) + "\ nn:" + str (n) + "\ ntotal:" + str (tot)) file.close(); x = 1 khi x == 1: getInput() if (n <=0 or n> = 20): #check cho in n "enter đúng n" nghỉ if (len (matrix_1) = n * n hoặc len (set (matrix_1))! = len (matrix_1)): # kiểm tra đầu vào là ok hay không in "nhập sai" ngắt nếu (set ([99> a> 9 cho ma trận_1 ])! = {True}): # kiểm tra giá trị của n in "nhập số thích hợp" ngắt hiển thị() saveFile() x = x + 1; – user4816019

+0

Nhận xét phá hủy định dạng mã, đặc biệt là trong các ngôn ngữ có khoảng trắng. Vui lòng [sửa] câu trả lời của bạn để bao gồm mã bổ sung. –

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 Thêm số 0 def cal(): list1 = []; cho hàng trong phạm vi (1, n + 1): cho col trong phạm vi (1, n + 1): tot = 0; count = 0; cho m trong phạm vi (-1,2): cho p trong phạm vi (-1,2): nếu (num_list [hàng + m] [col + p] == 0): count = count + 1; tot = tot + num_list [hàng + m] [col + p]; nếu (đếm! = 0): tot = tot/(9-count); khác: tot = tot/9 list1.append (str (tot) + ""); list1.append ("\ n"); in "" .join ([str (a) cho một trong danh sách1]) – user4816019

+0

x = 1; trong khi x == 1: num_list, n = get(); nếu (n> 20 hoặc n <3): in "n phải trong khoảng từ 3 đến 20" ngắt nếu (b_no!= 0): in "nhập chính xác" ngắt cal() x = x + 1; – user4816019

+1

Bạn biết có một tùy chọn * chỉnh sửa *, phải không? – livibetter

0

tôi sẽ tránh sử dụng dữ liệu [0] hoặc hàng [0], thay vào đó, tôi sẽ sử dụng '' .join (dữ liệu) hoặc '' .join (hàng) để tránh rỗng danh sách (liệt kê chỉ mục ngoài phạm vi lỗi).

Các vấn đề liên quan