У меня есть файл. Я разделяю это в классе. Кроме того, я хочу вернуть первые n лет с наибольшим количеством снятых фильмов. И я буду использовать атрибуты строк для получения данных.
import re
import collections
class movie_analyzer:
def __init__(self,s):
self.lines=open(s, encoding = "latin-1").read().split('\n')
self.lines=[x.split('::') for x in self.lines]
def freq_by_year(self):
movies_years = [x[3] for x in self.lines]
c = collections.Counter(movies_years)
for movies_years, freq in c.most_common(3):
print(movies_years, ':', freq)
movie=movie_analyzer("modified.dat")
movie.freq_by_year()
Это дает эту ошибку:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-627-51913258f9e4> in <module>
----> 1 movie.freq_by_year()
<ipython-input-624-8dc663c0b252> in freq_by_year(self)
9 def freq_by_year(self):
10
---> 11 movies_years = [x[3] for x in self.lines]
12
13 c = collections.Counter(movies_years)
<ipython-input-624-8dc663c0b252> in <listcomp>(.0)
9 def freq_by_year(self):
10
---> 11 movies_years = [x[3] for x in self.lines]
12
13 c = collections.Counter(movies_years)
IndexError: list index out of range
Кроме того, movie.lines выглядит так:
[['1', 'Toy Story', "Animation|Children's|Comedy", '1995'],
['2', 'Jumanji', "Adventure|Children's|Fantasy", '1995'],
['3', 'Grumpier Old Men', 'Comedy|Romance', '1995'],
['4', 'Waiting to Exhale', 'Comedy|Drama', '1995'],
['5', 'Father of the Bride Part II', 'Comedy', '1995'],
['6', 'Heat', 'Action|Crime|Thriller', '1995'],
['7', 'Sabrina', 'Comedy|Romance', '1995'],
['8', 'Tom and Huck', "Adventure|Children's", '1995'],
['9', 'Sudden Death', 'Action', '1995'],
['10', 'GoldenEye', 'Action|Adventure|Thriller', '1995']]
.dat файл выглядит так:
Movies = ["1::История игрушек::Анимация|Детская|Комедия::1995\n",
"2::Джуманджи::Приключения|Детская|Фэнтези::1995\n",
'3::Сварливые старики::Комедия|Романтика::1995\n',
'4::В ожидании выдоха::Комедия|Драма::1995\n',
'5::Отец невесты, часть 2::Комедия::1995\n']
И проверьте свои данные, возможно, у вас есть строка с меньшим количеством полей, чем вы ожидаете.
Можете ли вы предоставить содержимое файла «modified.dat»?
Я отредактировал часть ошибки.
Кроме того, я предоставил содержимое файла данных.
Я запустил ваш код с файлом, который я реконструировал из Movies
, и у меня это сработало. Возможно, вы ссылаетесь на неправильный файл.
Я обнаружил две потенциальные проблемы в функции __init__
, учитывая ваш код и файл .dat
:
def __init__(self, s):
self.lines = open(s, encoding = "latin-1").read().split('\n')
self.lines = [x.split('::') for x in self.lines]
self.lines = [l for l in self.lines if len(l) == 4] # <--(1)
for line in self.lines: # <--(2)
line[3] = re.sub('\D', '', line[3])
(1) Анализируется дополнительная строка, содержащая только пустой символ: ""
. Таким образом, из соображений безопасности вы можете удалить любую строку, в которой нет точно тех четырех элементов, которые вы ожидаете.
(2) Некоторые years
анализируются неправильно из-за прикрепленных к ним нецифровых символов, таких как ""
или /n
. Вы можете курировать столбец лет, используя регулярное выражение, которое фильтрует каждый символ, который не является цифрой.
Большое спасибо! Вы правы, это работает. В данных есть несколько лишних строк :/
Пожалуйста, включите код/ошибки/текстовые данные в виде текста, а не изображений. См. meta.stackoverflow.com/questions/285551/…