Ich versuche eine Funktion zu definieren, die eine txt-Datei öffnet und sie zu einer N*3 Matrix macht. Zeilen, die bestimmten Bedingungen nicht entsprechen, sollten jedoch übersprungen und eine Fehlermeldung angezeigt werden, bevor Sie mit dem Lesen der Zeilen fortfahren.

Das ist mein Code:

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

Ich habe also die Matrix, aber jetzt möchte ich sie Zeile für Zeile lesen, überspringen, wenn die Bedingungen nicht erfüllt sind, eine Fehlermeldung anzeigen, die erklärt, was der Fehler ist und in welcher Zeile er aufgetreten ist, und fortfahren.

Die Bedingungen sind:
• Die erste Spalte muss eine Zahl zwischen 10 und 60 sein.
• Die zweite Spalte muss eine positive Zahl sein.
• Die dritte Spalte muss 1,2,3 oder 4 sein.

Bearbeiten

Ich habe es versucht:

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

Aber es gibt mir alle Fehlermeldungen am Anfang und dann alle Zeilen, einschließlich derjenigen, die ausgeschlossen werden sollten.

Bearbeiten 2

Ich habe auch versucht, die Datei Zeile für Zeile zu lesen, indem ich:

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")  

Ich weiß, dass es die Zeilen nicht löschen würde, aber zumindest hatte ich gehofft, dass es mir die Fehlermeldungen für die richtigen Zeilen geben würde. Aber es kehrt zurück:

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

TypeError: '<' not supported between instances of 'str' and 'int'
-1
bubble33 18 Jän. 2019 im 16:33

3 Antworten

Beste Antwort

Ich bin es wieder :) Dieser Code ist die feste Version von Edit 2 in Frage Beschreibung:

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: Ich gehe davon aus, dass jede Zeile des Formats von test.txt genau "a b c" ist, wobei a, b und c Zahlen sind. Wenn es anders ist, lass es mich wissen, um es zu beheben

PPS: Wie Sie wissen, entfernt dieser Code die ungültigen Zeilen nicht und druckt nur die Fehlermeldungen

0
Dariush 18 Jän. 2019 im 18:20

Ich denke, Ihr Problem ist, dass Sie keine Daten mutieren, sobald die Bedingung erfüllt ist. So etwas wie der folgende Code sollte helfen, Ihr Problem zu lösen:

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

Ich hoffe, das hilft.

0
Faisal 18 Jän. 2019 im 14:21

Ich denke, das ist der Code, den Sie brauchen. Lass es mich wissen, wenn ich etwas falsch gemacht habe.

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'))
0
Dariush 18 Jän. 2019 im 18:05