web-dev-qa-db-fra.com

Erreur d'attribut: l'objet 'list' n'a pas d'attribut 'split'

J'essaie de lire un fichier et de diviser une cellule dans chaque ligne par une virgule, puis d'afficher uniquement les première et deuxième cellules contenant des informations sur la latitude et la longitude . Il s'agit du fichier:

temps, latitude, longitude , type2015-03-20T10: 20: 35.890Z, 38.8221664, -122.7649994 , séisme2015-03-20T10: 18: 13.070Z, 33.2073333, -116.6891667 , tremblement de terre2015-03-20T10: 15: 09.000Z, 62.242, -150.8769 , tremblement de terre

Mon programme:

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

Quand j'essaye d'exécuter ce programme, ça me donne une erreur 

"AttributeError: l'objet 'list' n'a pas d'attribut 'split'

Aidez-moi, s'il vous plaît! 

7
loveTrumpsHate

Je pense que vous avez réellement une confusion plus large ici.

L'erreur initiale est que vous essayez d'appeler split sur toute la liste de lignes et que vous ne pouvez pas split une liste de chaînes, mais uniquement une chaîne. Donc, vous devez splitchaque ligne, pas le tout.

Ensuite, vous utilisez for points in Type et attendez-vous que chacune de ces points vous donne une nouvelle x et y. Mais cela ne va pas arriver. Types est juste deux valeurs, x et y, donc tout d'abord points sera x, et ensuite les points seront y, et alors vous aurez terminé. Donc, encore une fois, vous devez boucler sur chaque ligne et obtenir les valeurs x et y de chaque ligne, et non pas une seule Types à partir d'une seule ligne.

Donc, tout doit être inséré dans une boucle sur chaque ligne du fichier et créer une variable split en x et y une fois pour chaque ligne. Comme ça:

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

En remarque, vous devriez vraiment close le fichier, idéalement avec une déclaration with, mais j'y reviendrai à la fin.


Fait intéressant, le problème ici n’est pas que vous soyez trop novice, mais que vous essayez de résoudre le problème de la même manière abstraite que le ferait un expert et que vous ne connaissez pas encore les détails. C'est complètement faisable. vous devez juste être explicite sur le mappage de la fonctionnalité, plutôt que de le faire implicitement. Quelque chose comme ça:

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

Ou, une meilleure façon d'écrire cela pourrait être:

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

Enfin, vous voudrez peut-être jeter un coup d’œil à NumPy et aux pandas, des bibliothèques qui do vous permettent de mapper implicitement la fonctionnalité sur un tableau entier ou un cadre de données presque de la même manière que vous l’essayiez.

10
abarnert

Le problème est que readlines est une liste de chaînes, chacune étant une ligne de filename. Peut-être que vous vouliez dire:

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