Почему я получаю сообщение AttributeError? - PullRequest
3 голосов
/ 21 марта 2019

У меня есть файл с именем tweets.txt.Каждая строка имеет формат:

[широта, долгота] значение, дата, время, текст

Пример данных, содержащихся в файле:

[41.298669629999999, -81.915329330000006] 6 2011-08-28 19:02:36 Работа должна пролететь мимо ... Я так взволнован, увидев Spy Kids 4 с любовью всей моей жизни ... ARREIC
[33.702900329999999, -117.95095704000001] 6 2011-08-28 19:03:13 Сегодня будет самый великий день в моей жизни.Нанимал фотографировать на 50-летие моего лучшего друга gparents.60 стариков.Woo.
[38.809954939999997, -77.125144050000003] 6 2011-08-28 19:07:05 Я просто положил свою жизнь как 5 чемоданов

Мое задание требует, чтобы я извлек первое и второеиндекс каждой строки (широта и долгота, которые являются целыми числами).Проблема в том, что они имеют такие символы, как «[», «,» и «]», и я хочу удалить их.

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

Как вы можете видеть, всякий раз, когда я вводю аргумент в строку wordstripвыше, будь то [, запятая или [, я получаю сообщение об ошибке:

AttributeError: у объекта 'list' нет атрибута 'rstrip'

Почему я получаю это сообщение?Я думал, что поступаю правильно.Каков будет правильный способ сделать это?

Ответы [ 3 ]

0 голосов
/ 21 марта 2019

Функция split() возвращает список, для которого вы не можете выполнять функции string.Проблема заключается в использовании этих двух строк в последовательности

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

В вашем случае, если вы уверены в этом точном формате, вы можете сделать следующее:

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
0 голосов
/ 21 марта 2019

В вашем коде есть несколько ошибок.

Во-первых, в общем, предпочтительнее использовать with для открытия файлов до open. Вы не закрываете свой файловый объект, поэтому ОС считает, что он все еще открыт (используется), пока вы не закроете Python.

Во-вторых, split, при запуске на строке разбивает на list строк. Вы хотите убрать запятые из всех таких подстрок, поэтому вам нужно перебрать результирующий list - не имеет смысла запускать strip на list, так как это не строка.

Наконец, повторение текста, считанного из файла таким образом, и переназначение переменной word не изменит этот текст на месте, а только на то, на что указывает переменная word, так что вы на самом деле не увидите ничего эффекты.

Пример:

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

Причина в том, что i указывает на целые числа от 1 до 5 подряд. Когда вы выполняете += на нем, то, что вы делаете, это , изменяя то, что i указывает на , вместо взятия объекта, на который указывает i, и изменения его .

В качестве аналогии: разница между следованием указателя к дому и покосом газона и перемещением указателя для указания на другой дом.

Попробуйте это:

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]

Действительно , наконец, как примечание: широта и долгота float, а не int, и вы можете преобразовать их соответственно, если необходимо.

0 голосов
/ 21 марта 2019

split разбивает строку в список.Вы пытаетесь выполнить rstrip в реальном списке, когда вам нужно вызвать его для каждого слова.

Вы можете выполнить цикл по списку, чтобы достичь этого:

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

В качестве альтернативы, вы можетеможно разделить его, как вы уже делаете, и получить доступ к нужным словам через индекс.

Для пояснения:

В вашем коде split() превращает word в:

["[38.809954939999997,",

"- 77.125144050000003]",

"6",

"2011-08-28 19:07:05",

" Я ",

" просто ",

" положи ",

" моя ",

" жизнь",

" в ",

" лайк ",

" 5 ",

" чемоданы "]

Вы пытаетесь выполнить одну rstrip, а не сами слова.Цикл по списку обращается к каждому слову и позволяет использовать rstrip.

...