3
votes

Pourquoi est-ce que je reçois un message AttributeError?

J'ai un fichier nommé tweets.txt. Chaque ligne est au format:

[latitude, longitude] valeur date heure texte

Un exemple des données contenues dans le fichier:

[41.298669629999999, -81.915329330000006] 6 2011-08-28 19:02:36 Le travail doit passer ... Je suis tellement excité de voir Spy Kids 4 avec l'amour de ma vie ... ARREIC
[33.702900329999999, -117.95095704000001] 6 2011-08-28 19:03:13 Aujourd'hui va être le plus beau jour de ma vie. Engagé pour prendre des photos au 50e anniversaire des parents de mon meilleur ami. 60 personnes âgées. Woo.
[38.809954939999997, -77.125144050000003] 6 2011-08-28 19:07:05 Je viens de mettre ma vie dans 5 valises

Mon devoir m'oblige à extraire le premier et le deuxième index de chaque ligne (latitude et longitude, qui sont des entiers). Le problème est que ceux-ci ont des caractères tels que "[", "," et "]" et je souhaite les supprimer.

tweetfile=input("Enter name of tweet file: ")  
infile=open(tweetfile,"r",encoding="utf-8")  
for line in infile:  
    line=line.rstrip()  
    word=line.split()  
    word=word.rstrip(",") 

Comme vous pouvez le voir, chaque fois que je saisis un argument dans la bande de mots ci-dessus, que ce soit [ une virgule ou [ je reçois toujours un message d'erreur disant:

AttributeError: l'objet 'list' n'a pas d'attribut 'rstrip'

Pourquoi est-ce que je reçois ce message? Je pensais que je faisais la bonne chose. Quelle serait la bonne façon de procéder?


1 commentaires

Parce que split () divise la ligne en une liste de mots, donc words est une liste. Vous devrez appeler rstrip sur chaque mot de la liste , pas sur la liste elle-même.


3 Réponses :


0
votes

split divise la chaîne en une liste. Vous essayez d'exécuter rstrip sur la liste réelle lorsque vous devez l'appeler sur chaque mot.

Vous pouvez parcourir la liste pour y parvenir:

for line in infile:  
    line=line.rstrip()  
    for word in line.split():
        word=word.rstrip(",")


5 commentaires

Cela ne ferait rien d'autre que la réaffectation à la variable de boucle.


@MarcusLim Ils auraient encore besoin d'effectuer leurs actions requises sur mot , mais cela devrait corriger l'erreur qu'ils rencontrent actuellement?


@AmandeepPasricha Vous devez l'exécuter sur chaque mot. J'ai modifié la réponse pour montrer un exemple de la raison pour laquelle c'est nécessaire.


@ItsPete oh ok je reçois. Cependant, pouvez-vous expliquer pourquoi même si je corrige l'erreur et le fais de cette façon, cela n'aurait aucun effet sur les mots eux-mêmes? Quelqu'un expliquait cela dans un autre commentaire.


@AmandeepPasricha Cela a un effet sur le mot pendant cette itération de la boucle, mais je n'ai pas mis de code pour utiliser le mot. J'ai seulement résolu le problème que vous aviez de ne pas pouvoir appeler rstrip . Marcus Lim disait que mon code n'effectue aucune autre action dessus.



0
votes

La fonction split () renvoie une liste sur laquelle vous ne pouvez pas exécuter les fonctions string . Le problème est d'utiliser ces 2 lignes dans la séquence

tweetfile=input("Enter name of tweet file: ")  
infile=open(tweetfile,"r",encoding="utf-8")  
for line in infile:  
    line=line.rstrip()  
    coordinates_string=line.split(']')
    coordinates_cleaned = coordinates_string[1:] #removes the [
    lat_lon_string = coordinates_cleaned.split(',') #split lat lon
    lat = lat_lon_string[0].strip()
    lon = lat_lon_string[1].strip()
    # convert to float if you would like then after

Dans votre cas, si vous êtes sûr de ce format exact, vous pouvez le faire:

word=line.split()  #this will actually return a list of words not just a word
word=word.rstrip(",")


3 commentaires

@AmandeepPasricha J'ai édité ma réponse pour clarifier cela, vous avez utilisé rstrip après split, rstrip nécessite une chaîne, tandis que split renvoie une liste


Pourriez-vous expliquer cette ligne: coordonnées_cleaned = chaîne_cordonnées [1:]. Je ne comprends pas très bien ce qui a été fait ici.


La partie chaîne des coordonnées contenues [au début et que vous souhaitez supprimer afin que vous puissiez utiliser les nombres sans provoquer d'erreurs de corversion



0
votes

Il y a quelques problèmes avec votre code.

Premièrement, en général, préférez utiliser avec pour ouvrir les fichiers à ouvrir . Vous ne fermez pas votre objet fichier, donc le système d'exploitation pense qu'il est toujours ouvert (en cours d'utilisation) jusqu'à ce que vous fermiez Python.

Deuxièmement, split , lorsqu'il est exécuté sur une chaîne, le divise en une liste de chaînes. Vous souhaitez supprimer les virgules de toutes ces sous-chaînes, vous devez donc parcourir la liste résultante - cela n'a pas de sens d'exécuter strip sur la liste , car ce n'est pas une chaîne.

Enfin, parcourir le texte lu à partir du fichier de cette manière et réassigner à la variable word ne changera pas ce texte en place, mais uniquement ce vers quoi pointe la variable word , vous ne verrez donc aucun effet.

Exemple:

tweet_path = input("Enter name of tweet file: ")
with open(tweet_path, "r", encoding='utf-8') as f:
    coordinates = [line.split()[:2] for line in f]

cleaned_coordinates = [(lat[1:-1], lon) for lat, lon in coordinates]

La raison en est que i pointe successivement vers les nombres entiers de 1 à 5. Lorsque vous exécutez + = dessus, ce que vous faites, c'est changer ce que i pointe vers , plutôt que prendre l'objet qui i pointe vers et le change .

Par analogie: c'est la différence entre suivre un panneau indiquant une maison et tondre la pelouse là-bas, et déplacer le panneau vers pointez vers une autre maison.

Essayez ceci:

>>> numbers = [1, 2, 3, 4, 5]
>>> for i in numbers:
...     i += 1
...
>>> numbers
[1, 2, 3, 4, 5]

Vraiment enfin, comme note: la latitude et la longitude sont float , pas int , et vous pouvez les convertir en conséquence si nécessaire.


2 commentaires

Hé merci, je fais mieux maintenant. Je suis encore un peu confus lorsque vous dites: "Enfin, parcourir le texte lu à partir du fichier de cette manière et réaffecter à la variable mot ne changera pas ce texte en place, mais seulement ce que le mot variable indique, donc vous avez gagné" t vraiment voir les effets ". Je ne comprends pas pourquoi je ne verrais aucun effet?


Hé merci, je vais mieux. Vous dites que vous n'éditez que le mot variable (qui est essentiellement i), n'est-ce pas? D'accord. Donc, cela ne change pas le code réel dans la ligne elle-même? Cela ne change que dans cette boucle, n'est-ce pas?