Использование readlines в python? Первый раз
у меня есть текстовый файл со столбцами данных, и мне нужно превратить эти столбцы в отдельные списки или массивы. Вот что у меня пока
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 ответов
вы получаете пустой список 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
если IndexError
occours - вы можете видеть себя, что он печатает пустой список:
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'
EDIT: вам лучше использовать модуль 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']
использовать С для filehandlers.
with open('path/to/file', 'r') as f:
for line in f:
# code.
вы индексируете ошибку, пытаясь получить доступ Data
на [0]
расположение.
что просто означает, что ваша линия была пуста.
вы должны выполнить быструю проверку перед разбором строки...
if len(Data):
#code
else:
#empty line?
f = open('data.txt', 'r')
temp = []
for row in f.readlines():
items = row.split(',')
temp.append(unicode(items[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;
#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;
#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] или строки[0], вместо этого я бы использовал ".join(Data) or ".join (row), чтобы избежать пустого списка (list index out of range error).