#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), правильно? Хорошо. Значит, это не изменяет фактический код в самой строке? Это изменяет его только в этом цикле, правильно?