问题
I have a text file with columns of data and I need to turn these columns into individual lists or arrays. This is what I have so far
f = open('data.txt', 'r')
temp = []
for row in f.readlines():
Data = row.split()
temp.append(float(Data[0]))
When I run this I get IndexError: list index out of range
.
Snippet of the data below:
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
I need the first column, if possible to look like this: Data = [16, 17, 18, 20, 21, 22, 24, 25, 26]
回答1:
You are getting an empty list Data=[]
if you read an empty row. You try to get the first element from the list using Data[0]
,but because it's an empty list it doesn't have an element at position 0, so you get an 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
This will print out the Data
if IndexError
occours - you can see yourself that it prints an empty list:
f=open('file','r')
temp = []
for row in f.readlines():
Data = row.split()
try:
temp.append(float(Data[0]))
except IndexError:
print Data
You can use the with
statement to open the file, that automatically closes the file after being processed. Also you can loop over the file itself, without using 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: You are better of using the csv module:
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']
回答2:
use with for filehandlers.
with open('path/to/file', 'r') as f:
for line in f:
# code.
you index error comes from trying to access Data
at the [0]
location.
which simply means your line was empty.
you should run a quick check before parsing the line...
if len(Data):
#code
else:
#empty line?
回答3:
f = open('data.txt', 'r')
temp = []
for row in f.readlines():
items = row.split(',')
temp.append(unicode(items[0]))
I hope that it solves your problem.
回答4:
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;
回答5:
#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:
#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
回答7:
I would avoid using Data[0] or row[0], instead, I would use ''.join(Data) or ''.join(row) to avoid empty list (list index out of range error).
来源:https://stackoverflow.com/questions/12996220/using-readlines-in-python-first-time