#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
был плохой идеей, обновлено. Но тот факт, что вы увидели это сообщение, означает, что вы не выполнили вторую строку снизу.