Ошибка атрибута: объект ‘str’ не имеет атрибута ‘csv’

#python

#python

Вопрос:

Я пытаюсь написать файл CSV, и у меня есть код для создания документа с заголовочным файлом, этот код будет принимать входные данные для записи в тот же файл.

 class CSVFile:

    def __init__(self, doctitle):
        #creates the physical doc on the disk
        #creates the header row in the .csv file
        self.doctitle = doctitle
        self.f = open(doctitle   ".csv", 'w ')
        self.f.write("vianumber, innerdiameter, outerdiamter, ratio n")
        self.closedoc()
        return


    def appendrow(self, doctitle, vianumber, innerdiameter, outerdiamter, ratio):
        #called for each measured via
        self.f = open(doctitle   ".csv", 'a ')
        self.f.write(vianumber, innerdiameter, outerdiamter, ratio)
        self.closedoc()
        return

    def closedoc(self):
        #filize the document
        self.f.close()
        return
  

Сообщение об ошибке, которое я получаю, выглядит следующим образом:

  CSVFile.appendrow("", "test", 2, 3, 4, 5)
Traceback (most recent call last):

  File "<ipython-input-21-07d259b7d2fa>", line 1, in <module>
    CSVFile.appendrow("", "test", 2, 3, 4, 5)

  File "C:/Users/Brook/Desktop/Senior Design/CSV file script.py", line 23, in appendrow
    self.f = open(doctitle   ".csv", 'a ')

AttributeError: 'str' object has no attribute 'f'
  

Комментарии:

1. разве это не должно self.doctitle быть просто doctitle ?

2. Изменение с self.doctitle на doctitle ничего не меняет.

3. Пожалуйста, укажите полное сообщение об ошибке и соответствующий код. Ошибка, скорее всего, не была вызвана опубликованным вами кодом.

4. Помимо этого, вы не записываете никаких разделителей в свой файл. Почему вы не используете csv модуль ?

5. Я думал, что использование «csv» превратит его в файл csv

Ответ №1:

Это потому, что вы не создаете экземпляр объекта. Ваш вызов CSVFile.appendrow("", "test", 2, 3, 4, 5) . По сути, это означает, что для параметра self appendrow вы передаете пустой строковый аргумент "" .

Попробуйте что-нибудь вроде CSVFile("test").appendrow("test", 2, 3, 4, 5)

У вас также есть ошибка в self.f.write вызове в вашем коде, но я позволю вам это исправить.

Ответ №2:

Ваш класс и способ его использования имеют много проблем, таких как:

  • Вы не используете сохраненное имя файла.
  • Вы не используете стандартный формат записи CSV.
  • Вы не используете with блоки.
  • Вы не создаете объект класса.
  • Вы создаете ненужные атрибуты объекта.
  • Вы передаете self параметр объектному методу.

Вот улучшенная версия вашего кода.

 import csv

class CSVFile:

    def __init__(self, doctitle):
        self.doctitle = doctitle   ".csv"
        with open(doctitle, 'w ') as f:
            writer = csv.writer(f)
            writer.writerow(["vianumber", "innerdiameter",
                             "outerdiamter", "ratio"])

    def appendrow(self, vianumber, innerdiameter, outerdiamter, ratio):
        #called for each measured via
        with open(self.doctitle, 'a ') as f:
            writer = csv.writer(f)
            writer.writerow([vianumber, innerdiameter, outerdiamter, ratio])

    #def closedoc(self): -- Not needed!
        #filize the document

mycsv = CSVFile("foo")
mycsv.appendrow(2,3,4,5)
  

Комментарии:

1. Потому что CSVFile.appendrow(2,3,4,5) неверно. Пожалуйста, внимательно прочитайте мой пример.

2. использование csv.appendrow(2,3,4,5) также выдает ошибку

3. csv.appendrow(2,3,4,5) Трассировка (последний последний вызов): файл «<ipython-input-79-49b8159c3024>», строка 1, в <модуле> csv.appendrow(2,3,4,5) Ошибка атрибута: модуль ‘csv’ не имеет атрибута ‘appendrow’

4. Верно, вызов переменной csv был плохой идеей, обновлено. Но тот факт, что вы увидели это сообщение, означает, что вы не выполнили вторую строку снизу.