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!
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 points
x
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.
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)