Не понимаю, как исправить ошибку TypeError: string indices must be integers, not 'str'
Уважаемые пользователи! Выполняю учебное задание, где нужно извлечь название издательства из текстового файла и получаю ошибку. Не знаю, как её исправить. Для аналогичного примера код был правильный. Пожалуйста, подскажите (только не ответом из серии "должно быть целое число" - я его не понимаю, - а как это сделать).
csv_file = 'C:/Users/User/Desktop/Python/Projects/data/vondel-stcn.csv'
with open(csv_file) as stream:
# call stream.readlines() to read all lines in the CSV file as a list.
lines = stream.readlines()
print(lines[:3])
import collections
from collections import Counter
publisher = collections.Counter()
for entry in csv_file:
publisher[entry['lang']] += 1
print(publisher.most_common())
TypeError Traceback (most recent call last)
Cell In[115], line 6
4 publisher = collections.Counter()
5 for entry in csv_file:
----> 6 publisher[entry['lang']] += 1
8 print(publisher.most_common())
TypeError: string indices must be integers, not 'str'
Вот пример нового кода. Он выводит сами значения, но не считает их количество.
import csv
with open('C:/Users/User/Desktop/Python/Projects/data/vondel-stcn.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row['publisher'])
Первые страницы файла с кодом:
f = open('C:/Users/User/Desktop/Python/Projects/data/vondel-stcn.csv')
text = f.read()
print(text[:600])
Вывод:
year,title,author,publisher
1642,Hiervsalem verwoest. Trevrspel.,Joost van den Vondel 1587-1679,"Matthijsz, Paulus Amsterdam"
1641,"Gysbrecht van Aemstel, d'ondergangh van zijn stad en zijn ballingschap. Treurspel.",Joost van den Vondel 1587-1679,"Houthaeck, Dirck Cornelisz Amsterdam"
1720,Joseph in Egypten. Trevrspel.,Joost van den Vondel 1587-1679,"Oosterwyk, Johannes van Amsterdam"
17XX,Lucifer. Treurspel.,Joost van den Vondel 1587-1679,"Wees, Abraham de I Amsterdam"
17XX,"De heerlyckheit der kercke haer ingang, opgang, en voortgang.",Joost van den Vondel 1587-1679,"Oude druckerije, de KoМ€
Ответы (1 шт):
Автор решения: insolor
→ Ссылка
Вариант максимально аналогичный первому вашему коду:
import csv
from collections import Counter
with open("data.csv", newline='') as csvfile:
# Используем DictReader, чтобы каждая строка загружалась
# как словарь, где ключи - названия столбцов
csv_reader = csv.DictReader(csvfile)
# Загружаем все строки csv файла в список
lines = list(csv_reader)
counter = Counter()
for entry in lines:
counter[entry["publisher"]] += 1
print(counter.most_common())
Но при обработке больших файлов лучше не грузить их в список целиком, а обрабатывать построчно:
import csv
from collections import Counter
with open("data.csv", newline='') as csvfile:
# Используем DictReader, чтобы каждая строка загружалась
# как словарь, где ключи - названия столбцов
csv_reader = csv.DictReader(csvfile)
# Должно быть внутри блока with,
# т.к. csv_reader-у нужно читать из файла,
# при выходе из блока with файл будет закрыт
counter = Counter()
for entry in csv_reader:
counter[entry["publisher"]] += 1
print(counter.most_common())