Python类中使用csv模块出现AttributeError,如何正确初始化模块?
解决AttributeError: 'CSV_Processing' object has no attribute 'reader'问题
哎,这个问题我太熟了——你这是不小心踩了命名冲突的坑!
咱们一步步拆解:你一开始导入了Python标准库的csv模块,但后面创建类实例的时候,居然把实例命名成了csv:
csv = CSV_Processing('CSV_file.csv')
这下可好,原来的csv模块被你自己的实例给覆盖了!当你的csv_init方法里执行csv.reader(csv_file)时,Python根本找不到原来的csv模块了,它以为你要访问这个CSV_Processing实例的reader属性,但你的类里根本没定义这个属性,自然就抛出AttributeError了。
修正后的代码
只需要把实例变量名改成和模块名不同的(比如csv_processor),再顺便优化下可变默认参数的坑(csv_content={}这种写法会导致多次调用方法时共享同一个字典,这通常不是预期行为):
import csv print(csv.__file__) class CSV_Processing: def __init__(self, file): self.file = file def csv_init(self, csv_content=None): # 规避可变默认参数的问题 if csv_content is None: csv_content = {} with open(self.file) as csv_file: csv_reader = csv.reader(csv_file) line_count = 0 for row in csv_reader: csv_content[str(line_count)] = row line_count += 1 print(csv_content) # 实例名改成和模块名不重复的 csv_processor = CSV_Processing('CSV_file.csv') csv_processor.csv_init()
额外小贴士
- 永远不要用Python标准库模块的名字来命名自己的变量、类或者文件,不然很容易出现这种覆盖模块的乌龙
- 函数的可变默认参数(比如
[]、{})要谨慎使用,最好像上面那样用None来初始化,然后在函数内部创建新的可变对象
内容的提问来源于stack exchange,提问作者iczyrski
相关产品推荐
相关产品推荐

