LoginSignup
2
0

More than 3 years have passed since last update.

【備忘録】Pythonのライブラリ名とプログラムのファイル名が同じだとAttributeErrorが出る【Python】

Last updated at Posted at 2021-03-31

概要

ふと「csvファイルにあるn行1列のデータをリスト型で読み込んで、指定された数だけランダムに要素を表示しよう」と思ったのでPythonで実装することに。
「データの読み込み」と「ランダムに要素を取り出す」という処理の練習になればいいな~というふんわりした理由で書き始めること10分、PowerShellで実行するとAttributeErrorが出現したのでその原因と解決策を書き散らしておきたいと思います。

というわけでテキトウに書いているので間違いがあるかもしれません。予めご理解よろしくお願いします。

実行環境

  • OS: Windows 10 Home
  • Python: ver. 3.9.0
  • エディター: Visual Studio Code(ver. 1.54.3)
  • CUI: Windows PowerShell

Pythonは公式サイトからDLしたexeファイルを使ってインストールしたものを使っています。
ライブラリはpipを使ってインストールしています。
VScodeには適当な拡張機能を入れてあります。

原因と解決策

実際に書いていたプログラムは以下の通り。

random.py
import random


def main():
    '''
    dataset.csvからデータをリスト型で読み込み、要素をランダムで表示する
    表示する要素数はキーボードから入力する
    '''
    # データの読み込み
    # データ以外の文字(「"」「,」「\n」の3つ)は削除する
    with open('dataset.csv', mode = 'r', encoding = 'utf-8') as f:
        data = list(map(lambda x: x.replace('"', '').strip().rstrip(','), list(f.readlines())))
    n = int(input('n = '))
    print(type(data))
    print(len(data))
    print(random.choice(data))


if __name__ == '__main__':
    main()

上記のプログラムをPowerShell上で実行すると

PowerShell
$ python random.py
n = 1
<class 'list'>
20
Traceback (most recent call last):
  File "長ったらしいので省略\random.py", line 21, in <mo
    main()
  File "長ったらしいので省略\random.py", line 17, in mai
    print(random.choice(data))
AttributeError: module 'random' has no attribute 'choice'

といった感じでエラーが出ます。
アトリビュートエラー、randomモジュールはchoiceという属性を持っていません。

おかしいなぁ、randomライブラリにはchoice関数があるはずなのに。

というわけでAttributeErrorについてググって見ると原因が判明。
それは......

ファイル名とモジュール名が一緒 だから。

はい。君、予約語って知ってるぅ?←
気づいてしまえばしょーもないミスでした。

そりゃモジュールとファイル、同じ名前のものがあればごちゃごちゃにもなります。
というわけで解決策はファイル名をrandom.pyからrand.pyに変えるというものでした。

ファイル名を変えた状態でプログラムを実行すると以下のようになります。

PowerShell
$ python rand.py
n = 1
<class 'list'>
20
re

はい。実行できました(変数nについては触れないでください)。

結論

ファイル名はプログラム内で登場する関数や変数と被らないようにしましょう(あたりまえ)。

おまけ

ちなみに、dataset.csvの中身は以下の通りです(Pythonの標準ライブラリの名前を適当に抜粋したものです)。

dataset.csv
"string",
"re",
"difflib",
"textwrap",
"unicodedata",
"stringprep",
"readline",
"rlcompleter",
"struct",
"codecs",
"datatime",
"zoneinfo",
"calendar",
"collections",
"collections.abc",
"heapq",
"bisect",
"array",
"weakref",
"types"
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0