Я пытаюсь прочитать файл CSV в список, используя класс. Метод работает правильно из файла, содержащего метод, но когда я пытаюсь вызвать метод в main.py с помощью класса, я получаю следующую ошибку: Ожидаемый тип «Readit», вместо этого получил «str». Можете ли вы помочь мне исправить этот код, чтобы он работал, и объяснить, почему мой код неверен? ТИА.
Это мой каталог в Pycharm Проект->PythonTest->main.py, Stuff.py, test.csv
Содержимое CSV-файла
Содержимое файла test.csv: a,b,c (строка 1), 1,2,3 (строка 2) и 4,5,6 (строка 3).
Класс в Stuff.py
class Readit:
def __init__(self, file_name):
self.file_name = file_name
def csv_to_list(self):
from csv import DictReader
with open(self.file_name) as a_file:
csv_reader = DictReader(a_file)
temp = csv_reader
print(temp)
Файл main.py
from Stuff import Readit
file_name = "test.csv"
test_result = Readit.csv_to_list(file_name)
print(test_result)
При запуске в материале csv_to_list выдает этот вывод [{'a': '1', 'b': '2', 'c': '3'}, {'a': '4', 'b': '5', 'c': '6 '}]
но я получаю сообщение об ошибке ниже, когда пытаюсь вызвать метод в main.py
Ожидаемый тип 'Readit', вместо этого получен 'str'
Спасибо, Сэмвайз. Я намерен выполнить ряд операций с этим файлом. Это казалось подходящим использованием для класса? У меня гораздо больше опыта в функциональном программировании, поэтому я все еще борюсь с парадигмой ООП.
Это не лучший вариант использования для определения собственного класса, потому что единственные данные в вашем классе — это имя файла, и для этого существует отличный существующий класс — str. ООП не означает, что все должно быть в своем собственном классе; смысл классов обычно в том, чтобы их можно было повторно использовать другим кодом как есть, и Python поставляется с множеством очень полезных и гибких встроенных классов.






Вы отправили имя_файла в функцию, а не в объект, и ваша функция не возвращает никакого результата. Если вы немного измените свой код:
import csv
class Readit:
def __init__(self, file_name):
self.file_name = file_name
def csv_to_list(self):
dict_list = []
with open(self.file_name, newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
dict_list.append(row)
return dict_list
def main():
file_name = "test.csv"
obj = Readit(file_name).csv_to_list()
print(obj)
if __name__ == "__main__":
main()
Выход:
[{'a': '1', 'b': '2', 'c': '3'}, {'a': '4', 'b': '5', 'c': '6'}]
Readit(file_name).csv_to_list()может работать лучше. Но было бы проще сделать это отдельной функцией, а не строить вокруг нее класс без особой причины.