Почему я получаю сообщение об ошибке атрибута?

#python #attributeerror

#python #ошибка атрибута

Вопрос:

У меня есть файл с именем 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-летия моего лучшего друга и его родителей. 60 пожилых людей. Вау.
[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 выше, будь то [, запятая или [, я продолжаю получать сообщение об ошибке, гласящее:

Ошибка атрибута: объект ‘list’ не имеет атрибута ‘rstrip’

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

Комментарии:

1. Потому что split() разбивает строку на список слов, так что words это список. Вам нужно было бы вызывать rstrip для каждого слова в списке , а не для самого списка.

Ответ №1:

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
  

Комментарии:

1. @AmandeepPasricha Я отредактировал свой ответ, чтобы прояснить это, вы использовали rstrip после разделения, rstrip требует строку, в то время как split возвращает список

2. Не могли бы вы объяснить эту строку: coordinates_cleaned = coordinates_string[1:]. Я не совсем понимаю, что здесь было сделано.

3. Строковая часть координат содержалась [ в начале, и вы хотите удалить ее, чтобы вы могли использовать числа, не вызывая ошибок преобразования

Ответ №2:

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»,

«Я»,

«просто»,

«поместить»,

«мой»,

«жизнь»,

«in»,

«нравится»,

«5»,

«чемоданы»]

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

Комментарии:

1. Это ничего не дало бы, кроме переназначения переменной цикла.

2. @MarcusLim Им все равно нужно было бы выполнить свои действия, требуемые на word , но это должно исправить ошибку, с которой они в настоящее время сталкиваются?

3. @AmandeepPasricha Вам нужно выполнить это для каждого слова. Я отредактировал ответ, чтобы показать пример того, зачем это нужно.

4. @ItsPete о, хорошо, я понял. Однако можете ли вы объяснить, почему, даже если я исправлю ошибку и сделаю это таким образом, это никак не повлияет на сами слова? Кто-то объяснял это в другом комментарии.

5. @AmandeepPasricha Это влияет на word во время этой итерации цикла, но я не вставлял никакого кода для использования word. Я только исправил проблему, с которой у вас была невозможность вызвать rstrip . Маркус Лим говорил, что мой код не выполняет с ним никаких других действий.

Ответ №3:

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

Во-первых, в общем, предпочитаю использовать 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 , и вы можете преобразовать их соответствующим образом, если необходимо.

Комментарии:

1. Эй, спасибо, теперь я действительно понимаю это лучше. Я все еще немного сбит с толку, когда вы говорите «Наконец, повторение текста, прочитанного из файла таким образом, и переназначение переменной word не изменит этот текст на месте, а только то, на что указывает переменная word, так что на самом деле вы не увидите никаких эффектов». Я не понимаю, почему я не вижу никаких эффектов?

2. Привет, спасибо, я понял это лучше. Вы говорите, что редактируете только переменную word (которая в основном является i), правильно? Хорошо. Значит, это не изменяет фактический код в самой строке? Это изменяет его только в этом цикле, правильно?