Читайте построчно и пропускайте при условии, используя numpy - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь определить функцию, которая открывает текстовый файл, сделать его N*3 матрицей. Однако строки, которые не соответствуют определенным условиям, следует пропустить, и перед продолжением чтения строк должно отображаться сообщение об ошибке.

Это мой код:

import numpy as np
def dataLoad(filename):
    data=np.loadtxt(filename)
    return data

Итак, у меня есть матрица, но теперь я хотел бы прочитать ее построчно, пропустить, когда условия не выполняются, отобразить сообщение об ошибке, объясняющее, что это за ошибка и на какой строке она произошла, и продолжить.

Условия:
• Первый столбец должен быть числом от 10 до 60.
• Второй столбец должен быть положительным числом.
• Третий столбец должен быть 1,2,3 или 4.

Редактировать

Я пробовал:

import numpy as np
def dataLoad(filename):
    data=np.loadtxt(filename)
    for row in data:
        if (row[0] < 10) or (row[0] > 60):
            print("Temperature is out of range")
            continue
        elif (row[1]<0):
            print("Growth rate is negative")
            continue
        elif (row[2]!=1) or (row[2]!=2) or (row[2]!=3) or (row[2]!=4):
            print("Bacteria is not 1, 2, 3 or 4")
            continue
    return data

Но это дает мне все сообщения об ошибках в начале, а затем все строки, включая те, которые должны быть исключены.

Редактировать 2

Я также пытался читать файл построчно, используя:

data = open("test.txt", "r")
line = data.readline()
if (line[0] < 10) or (line[0] > 60):
    print("Temperature is out of range")
elif (line[1]<0):
    print("Growth rate is negative")
elif (line[2]!=1) or (line[2]!=2) or (line[2]!=3) or (line[2]!=4):
    print("Bacteria is not 1, 2, 3 or 4")  

Я знаю, что строки не будут удалены, но, по крайней мере, я надеялся, что это даст мне сообщения об ошибках для правильных строк. Но это возвращает:

 if (line[0] < 10) or (line[0] > 60):

TypeError: '<' not supported between instances of 'str' and 'int'

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Я думаю, что ваша проблема в том, что вы не изменяете данные, как только условие выполнено. Что-то вроде приведенного ниже кода должно помочь решить вашу проблему:

import numpy as np
def dataLoad(filename):
    data=np.loadtxt(filename)
    retdata = []
    for row in data:
        if (row[0] < 10) or (row[0] > 60):
            print("Temperature is out of range")
            continue
        elif (row[1]<0):
            print("Growth rate is negative")
            continue
        elif (row[2]!=1) or (row[2]!=2) or (row[2]!=3) or (row[2]!=4):
            print("Bacteria is not 1, 2, 3 or 4")
            continue
    retdata.append(row)
    return retdata

Надеюсь, это поможет.

0 голосов
/ 18 января 2019

это снова я :) этот код является фиксированной версией Edit 2 в описании вопроса:

data = open("test.txt", "r").readlines()
for raw_line in range(len(data)):
    line = [int(n) for n in data[raw_line].split(' ')]# this splits the "1 2 3" to ['1','2','3'] and then, makes them integer([1,2,3])
    if (line[0] < 10) or (line[0] > 60):
        print("Temperature is out of range in row",raw_line)
    elif (line[1]<0):
        print("Growth rate is negative in row",raw_line)
    elif (line[2]!=1) or (line[2]!=2) or (line[2]!=3) or (line[2]!=4):
        print("Bacteria is not 1, 2, 3 or 4 in row",raw_line) 

PS: я предполагаю, что каждая строка формата test.txt в точности соответствует "a b c", где a, b и c - числа. если это не так, дайте мне знать, чтобы это исправить

PPS: как вы знаете, этот код не удаляет недопустимые строки и просто печатает сообщения об ошибках

0 голосов
/ 18 января 2019

Я думаю, что это код, который вам нужен. дайте мне знать, если я ошибаюсь.

import numpy as np

def dataLoad(filename):
    #opening and reading the data file
    file=open(filename,'r').readline()
    #creating the numpy matrix object
    data=np.matrix(file)

    print('raw data:',data)

    #checking the conditions
    #... for first column
    i=0
    while(i<len(data)):
        if data.item(i,0)<10 or 60<data.item(i,0):
            print('error message')
            print('removed',data[i])
            data=np.delete(data,(i),axis=0)
        else:
            i+=1

    print('data after checking 1st condition:',data)

    #... for second column
    i=0
    while(i<len(data)):
        if data.item(i,1)<0:
            print('error message')
            print('removed',data[i])
            data=np.delete(data,(i),axis=0)
        else:
            i+=1

    print('data after checking the 2nd condition:',data)

    #... for third column
    i=0
    while(i<len(data)):
        if data.item(i,2) not in (1,2,3,4):
            print('error message')
            print('removed',data[i])
            data=np.delete(data,(i),axis=0)
        else:
            i+=1

    print('data after checking the 3rd condition:',data)
    return data

print(dataLoad('test.txt'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...