2013-08-06 4 views
0

Привет У меня есть быстрый вопрос о поиске строки # из моего текста и использования этой линии # вычислить что-топитон высчитывает стол без (Numpy)

(это не HW вопрос и я просто начать изучение Python)

экс ~ если мой текст выглядит

100 200 300 
400 500 600 
700 800 900 
120 130 140 
150 160 170 

и

f1 = open('sample4.txt','r') 

line_num = 0 
search_phrase = "100" 

for line in f1.readlines(): 
line_num += 1 
if line.find(search_phrase) >= 0: 
    x = line_num 
    print (x) 

import numpy 
data = numpy.loadtxt('sample4.txt') 
print(data[x:x+3,1].sum()) 

я мог получить

1430.0 which is (200+500+800+130) 

однако, если мой текст выглядит следующим образом:

apple is good 
i dont like apple 
100 200 300 
400 500 600 
700 800 900 
120 130 140 
150 160 170 
i love orange 

ошибка выскакивает и говорит

Traceback (most recent call last): 
File "C:/Python33/sample4.py", line 13, in <module> 
data = numpy.loadtxt('sample4.txt') 
File "C:\Python33\lib\site-packages\numpy\lib\npyio.py", line 827, in loadtxt 
items = [conv(val) for (conv, val) in zip(converters, vals)] 
File "C:\Python33\lib\site-packages\numpy\lib\npyio.py", line 827, in <listcomp> 
items = [conv(val) for (conv, val) in zip(converters, vals)] 
ValueError: could not convert string to float: b'apple' 

я думаю, что причина, почему эта ошибка всплывает еще потому NUMPY

есть ли способ сделать это правильно? без использования какого-либо skip_header или skip_footer

+0

Могут ли строки с текстом появляться в любом месте вашего файла или всегда в начале? Что вам не нравится в пропуске нескольких строк при чтении файла? – Floris

+0

Вы можете передать что-то необязательному аргументу 'dtype' в' np.loadtxt'. ('dtype' по умолчанию имеет значение float, поэтому вы видите ошибку) – Justin

+0

В качестве примечания, посмотрите на [' перечисление'] (http://docs.python.org/3.3/library/functions.html# enumerate), если вы хотите получить номер строки каждой строки; это намного проще (и более надежным), чем пытаться отслеживать это явно. – abarnert

ответ

1

Похоже, что loadtxt может использовать дескриптор файла как входной, поэтому один (возможно, уродливый) трюк может состоять в том, чтобы сначала определить строку вашего интересного текста так же, как вы, а затем снова открыть файл, прочитал первые несколько строк неинтересные, а затем передать дескриптор файла loadtxt (непроверенные):

fname = 'sample4.txt' 
search_phrase = '100' 

with open(fname) as fid: 
    for linenum, line in enumerate(fid): 
     if search_phrase in line: 
      break #if the n-th line is interesting, line_num = n-1 

#reopen file 
with open(fname) as fid: 
    for i in xrange(linenum): 
     fid.readline() #throw away uninteresting lines 
    data = np.loadtxt(fid) #pass file handle 

print(data[:3,1].sum()) #interesting stuff is now in first row 

Но то, что случилось с использованием SkipRows? Вторая часть затем может быть изменена на

#get linenum as before 
data = np.loadtxt(fname, skiprows = linenum) 
print(data[:3,1].sum()) #interesting stuff is now in first row 
+0

Благодарим вас за объяснение ~ просто быстрый вопрос о том, что ошибка значения появляется, если я положил новую строку «i love orange» внизу: ((что мне делать?) ValueError: не удалось преобразовать строку в float : b'i ' – user2658029