Не понимаю, как исправить ошибку 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())
→ Ссылка