概要
ふと「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には適当な拡張機能を入れてあります。
原因と解決策
実際に書いていたプログラムは以下の通り。
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上で実行すると
$ 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
に変えるというものでした。
ファイル名を変えた状態でプログラムを実行すると以下のようになります。
$ python rand.py
n = 1
<class 'list'>
20
re
はい。実行できました(変数nについては触れないでください)。
結論
ファイル名はプログラム内で登場する関数や変数と被らないようにしましょう(あたりまえ)。
おまけ
ちなみに、dataset.csvの中身は以下の通りです(Pythonの標準ライブラリの名前を適当に抜粋したものです)。
"string",
"re",
"difflib",
"textwrap",
"unicodedata",
"stringprep",
"readline",
"rlcompleter",
"struct",
"codecs",
"datatime",
"zoneinfo",
"calendar",
"collections",
"collections.abc",
"heapq",
"bisect",
"array",
"weakref",
"types"