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?
3 Réponses :
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(",")
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.
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(",")
@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
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.
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?
Parce que
split ()
divise la ligne en une liste de mots, doncwords
est une liste. Vous devrez appelerrstrip
sur chaque mot de la liste , pas sur la liste elle-même.