webentwicklung-frage-antwort-db.com.de

Attributfehler: 'list'-Objekt hat kein Attribut' split '

Ich versuche, eine Datei zu lesen und eine Zelle in jeder Zeile durch ein Komma aufzuteilen. Dann werden nur die erste und die zweite Zelle angezeigt, die Informationen zu Breitengrad und Längengrad enthalten. Dies ist die Datei:

zeit, Breite, Länge , Typ2015-03-20T10: 20: 35.890Z, 38.8221664, -122.7649994 , Erdbeben2015-03-20T10: 18: 13.070Z, 33.2073333, -116.6891667 Erdbeben2015-03-20T10: 15: 09.000Z, 62.242, -150.8769 , Erdbeben

Mein Programm:

def getQuakeData():
    filename = input("Please enter the quake file: ")
    readfile = open(filename, "r")
    readlines = readfile.readlines()

    Type = readlines.split(",")
    x = Type[1]
    y = Type[2]
    for points in Type:
        print(x,y)
getQuakeData()

Wenn ich versuche, dieses Programm auszuführen, gibt es einen Fehler 

"AttributeError: 'list'-Objekt hat kein Attribut' split '

Bitte hilf mir! 

7
loveTrumpsHate

Ich glaube, Sie haben hier eine größere Verwirrung.

Der Anfangsfehler ist, dass Sie versuchen, split für die gesamte Zeilenliste aufzurufen, und Sie können split keine Liste von Zeichenfolgen, sondern nur eine Zeichenfolge. Sie müssen also split jede Zeile , nicht die ganze Sache.

Und dann machen Sie for points in Type und erwarten, dass jeder dieser points Ihnen einen neuen x und y gibt. Aber das wird nicht passieren. Types ist nur zwei Werte, x und y, also wird zuerst pointsx und dann Punkte y und dann sind Sie fertig. Sie müssen also erneut über jede Zeile eine Schleife ausführen und die Werte x und y von jeder Zeile abrufen, nicht eine einzelne Types-Schleife aus einer einzelnen Zeile.

Also muss alles in einer Schleife über jede Zeile in der Datei gehen und split in x und y einmal für jede Zeile ausführen. So was:

def getQuakeData():
    filename = input("Please enter the quake file: ")
    readfile = open(filename, "r")

    for line in readfile:
        Type = line.split(",")
        x = Type[1]
        y = Type[2]
        print(x,y)

getQuakeData()

Als Randbemerkung sollten Sie die Datei wirklich close verwenden, am besten mit einer with-Anweisung, aber dazu komme ich am Ende.


Interessanterweise ist das Problem hier nicht, dass Sie zu viel Neuling sind, sondern dass Sie versuchen, das Problem auf dieselbe abstrakte Weise zu lösen, die ein Experte tun würde, und die Details noch nicht kennen. Das ist völlig machbar. Sie müssen nur explizit die Funktionalität abbilden, anstatt sie nur implizit auszuführen. Etwas wie das:

def getQuakeData():
    filename = input("Please enter the quake file: ")
    readfile = open(filename, "r")
    readlines = readfile.readlines()
    Types = [line.split(",") for line in readlines]
    xs = [Type[1] for Type in Types]
    ys = [Type[2] for Type in Types]
    for x, y in Zip(xs, ys):
        print(x,y)

getQuakeData()

Oder, eine bessere Art zu schreiben, könnte sein:

def getQuakeData():
    filename = input("Please enter the quake file: ")
    # Use with to make sure the file gets closed
    with open(filename, "r") as readfile:
        # no need for readlines; the file is already an iterable of lines
        # also, using generator expressions means no extra copies
        types = (line.split(",") for line in readfile)
        # iterate tuples, instead of two separate iterables, so no need for Zip
        xys = ((type[1], type[2]) for type in types)
        for x, y in xys:
            print(x,y)

getQuakeData()

Abschließend möchten Sie vielleicht einen Blick auf NumPy und Pandas werfen, Bibliotheken, in denen do die Möglichkeit bietet, Funktionen implizit auf ein ganzes Array oder einen Datenrahmen zu übertragen, und zwar auf die gleiche Weise, wie Sie es versucht haben.

10
abarnert

Das Problem ist, dass readlines eine Liste von Strings ist, von denen jede eine Zeile von filename ist. Vielleicht meinten Sie:

for line in readlines:
    Type = line.split(",")
    x = Type[1]
    y = Type[2]
    print(x,y)
0
ODiogoSilva