在python中使用readlines?第一次

时间:2012-10-21 08:34:39

标签: 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]

7 个答案:

答案 0 :(得分: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 if IndexError成就 - 您可以看到它打印出一个空列表:

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']

答案 1 :(得分:2)

用于文件处理程序。

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

您的索引错误来自于尝试访问Data位置的[0]。 这只是意味着你的行是空的。

你应该在解析这条线之前快速检查......

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

答案 2 :(得分:0)

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

我希望它能解决你的问题。

答案 3 :(得分: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;

答案 4 :(得分: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

答案 5 :(得分: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; 

答案 6 :(得分:0)

我会避免使用Data [0]或row [0],而是使用&#39;&#39; .join(数据)或&#39;&#39; .join(行)来避免空列表(列表索引超出范围错误)。