【问题标题】:Python program Attribute:Error module 'reader' has no attribute 'Reader'Python程序属性:错误模块'reader'没有属性'Reader'
【发布时间】:2018-11-26 21:14:37
【问题描述】:

我正在尝试在 C:\reader\compressed\ 中测试运行我的程序,在那里我创建了两个测试文件“test.gzip”和“test.bz2”,但是当我运行 Reader 类时,我得到了模块阅读器没有属性“阅读器”。

我打开 python 以“导入阅读器”然后“r = reader.Reader('test.bz2')” 目录如下:

我可以导入我创建的所有模块。

import reader
import reader.compressed
import reader.compressed.gzipped
import reader.compressed.bzipped

这是我的 reader.py:

import os

from reader.compressed import gzipped, bzipped

extension_map = {
    '.bz2': bzipped.opener, 
    '.gz': gzipped.opener,
}

class Reader:
def __init__(self, filename):
    extension = os.path.splitext(filename)[1]
    opener = extension_map.get(extension, open)
    self.f = opener(filename, 'rt')

    def close(self):
        self.f.close()

    def read(self):
        return self.f.read()

我检查了我的模块以查看它们是否与要测试的新文件一起存在,这些文件应该返回消息。

>>> import reader
>>> r= reader.reader.Reader('test.gz')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: module 'reader' has no attribute 'reader'

Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "C:\Develop\Python\reader\__init__.py", line 13, in 
 __init__
 self.f = opener(filename, 'rt') 
 File"C:\Python\Python36\lib\gzip.py", line 53, in open
binary_file = GzipFile(filename, gz_mode, compresslevel)
File  
 "C:\Programs\Python\Python36\lib\gzip.py", line 163, in 
 __init__
fileobj = self.myfileobj = builtins.open(filename, mode or 
'rb')
FileNotFoundError: [Errno 2] No such file or directory: 
'test.gz'

【问题讨论】:

  • 你是如何运行 Reader 类的?
  • 我不完全理解您的文件和模块布局,但我猜您的 reader.py 文件(定义 reader 模块)和定义的 C:\reader 文件夹之间存在冲突一个reader 包(其中包含compressed 子包)。
  • @Blckknght 我添加了文件视图。
  • @PaulaThomas 我有上面的命令。我“导入阅读器”然后“r= reader.Reader('test.gzip')”
  • 但是 reader.compressed 是从哪里来的?

标签: python python-module python-packaging


【解决方案1】:

Reader 类未在顶级 reader 模块中定义。相反,它是在reader.reader 中定义的,因为顶级reader 是一个包。

如果您当前导致错误的代码是:

import reader
r= reader.Reader('test.gzip')

您需要将其更改为使用reader.reader 而不仅仅是reader

import reader.reader
r = reader.reader.Reader('test.gzip')

或者,您可以将reader/reader.py 的内容移动到reader/__init__.py,因为后者是定义reader 包内容的位置。或者您可以拆分差异,并保留reader.py 文件,同时仍然使该类在包级别可用,在__init__.py 中使用类似这样的东西(注意我没有测试过这个,有一些奇怪的相对导入的极端情况来自__init__.py 文件):

from .reader import Reader

【讨论】:

  • 我已经在排除故障时尝试了这两种方法,但问题仍然存在。
  • 请显示您尝试过的代码以及运行时遇到的异常的完整回溯。如果您确实有 reader.Reader 类,或者您实际上尝试使用 reader.reader.Reader,那么您至少应该得到一个不同的错误,即使它不起作用。
【解决方案2】:

您的文件名不应与标准模块名相同。所以,将reader.py 重命名为reader1.py 左右。

【讨论】:

  • 没有名为reader 的标准库模块(至少,不在顶层)。
  • @Blckknght 我添加了 Traceback。
猜你喜欢
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
  • 2014-07-23
  • 2019-07-09
  • 2019-07-25
相关资源
最近更新 更多