AttributeError:'str'对象没有属性'csv'

问题描述 投票:-1回答:2

我正在尝试编写一个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'
python
2个回答
0
投票

这是因为您没有实例化对象。你的电话是CSVFile.appendrow("", "test", 2, 3, 4, 5)。从本质上讲,它意味着对于appendrow的self参数,你传递一个空字符串参数""

尝试沿着CSVFile("test").appendrow("test", 2, 3, 4, 5)线的东西

您的代码中的self.f.write调用中也有错误,但我会让您解决此问题。


0
投票

你的课程和你使用它的方式有很多问题,例如:

  • 您不使用存储的文件名。
  • 您不使用标准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)
© www.soinside.com 2019 - 2024. All rights reserved.