为什么Python程序会根据文件名引发异常?

为什么Python程序会根据文件名引发异常?,python,matplotlib,Python,Matplotlib,我只是在学Python 我有一个包含以下内容的文件 import datetime as dt import matplotlib.pyplot as plt from matplotlib import style import pandas as pd import pandas_datareader.data as web 如果我将此文件命名为csv2.py并调用: python csv2.py 它可以工作。但是如果我将此文件命名为csv.py并运行: python csv.py 它

我只是在学Python

我有一个包含以下内容的文件

import datetime as dt
import matplotlib.pyplot as plt
from matplotlib import style
import pandas as pd
import pandas_datareader.data as web
如果我将此文件命名为
csv2.py
并调用:

python csv2.py
它可以工作。但是如果我将此文件命名为
csv.py
并运行:

python csv.py
它会触发此异常:

C:\Git\algotrading [master ≡ +3 ~0 -0 !]> python csv.py
Traceback (most recent call last):
  File "csv.py", line 2, in <module>
    import matplotlib.pyplot as plt
  File "C:\Users\andrerpena\AppData\Local\Programs\Python\Python35-32\lib\site-packages\matplotlib\pyplot.py", line 29, in <module>
    import matplotlib.colorbar
  File "C:\Users\andrerpena\AppData\Local\Programs\Python\Python35-32\lib\site-packages\matplotlib\colorbar.py", line 34, in <module>
    import matplotlib.collections as collections
  File "C:\Users\andrerpena\AppData\Local\Programs\Python\Python35-32\lib\site-packages\matplotlib\collections.py", line 36, in <module>
    import matplotlib.mlab as mlab
  File "C:\Users\andrerpena\AppData\Local\Programs\Python\Python35-32\lib\site-packages\matplotlib\mlab.py", line 172, in <module>
    import csv
  File "C:\Git\algotrading\csv.py", line 2, in <module>
    import matplotlib.pyplot as plt
AttributeError: module 'matplotlib' has no attribute 'pyplot'
C:\Git\algotrading[master≡ +3~0-0!]>python csv.py
回溯(最近一次呼叫最后一次):
文件“csv.py”,第2行,在
将matplotlib.pyplot作为plt导入
文件“C:\Users\Andrepena\AppData\Local\Programs\Python\Python35-32\lib\site packages\matplotlib\pyplot.py”,第29行,在
导入matplotlib.colorbar
文件“C:\Users\andrepena\AppData\Local\Programs\Python\Python35-32\lib\site packages\matplotlib\colorbar.py”,第34行,在
将matplotlib.collections导入为集合
文件“C:\Users\Andrepena\AppData\Local\Programs\Python\Python35-32\lib\site packages\matplotlib\collections.py”,第36行,在
将matplotlib.mlab导入为mlab
文件“C:\Users\andrepena\AppData\Local\Programs\Python\Python35-32\lib\site packages\matplotlib\mlab.py”,第172行,在
导入csv
文件“C:\Git\algotrading\csv.py”,第2行,在
将matplotlib.pyplot作为plt导入
AttributeError:模块“matplotlib”没有属性“pyplot”
我花了大约40分钟才弄明白这个问题。我是说。。找出与文件名有关的问题


为什么会发生这种情况?

csv.py
内置于python中,因此受到限制


如果您运行python解释器并尝试
导入csv
,则无需下载任何新内容即可成功

看起来matplotlib.pyplot通过各种导入需要调用“导入csv”的mlab.py。这应该会找到一个名为csv的文件(不是您的),但由于您已将文件重命名为csv.py,它正在尝试导入该文件,从而覆盖所需的导入,并破坏matplotlib.pyplot的导入。

igoldthwaiteDaniel Dobalian所说:

如果创建名为:csv.py的文件,其内容如下:

import csv
print(csv)
并运行:

python csv.py
您将看到此文件导入自身:

 <module 'csv' from '/home/your/folder/csv.py'>
结果:

<module 'subprocess' from '/home/your/folder/subprocess.py'>

最后,如果使用名为matplotlib.py的文件执行此操作,将得到相同的结果:

import subprocess

print(subprocess)
import matplotlib
print(matplotlib)
# <module 'matplotlib' from '/home/your/folder/matplotlib.py'>
导入matplotlib
打印(matplotlib)
# 

csv
是用Python打包的标准模块,
matplotlib
尝试导入。它不是导入标准模块,而是导入您的文件
csv
是一个标准Python模块。不要调用您的文件
csv.py
,请改名。谢谢。我只是在学习。Python将脚本的路径添加到其模块搜索路径中,这就是同一目录中的其他脚本可以屏蔽已安装模块的原因。您可能还没有做到这一点,但是使用自己的子目录的包没有这个问题。如果制作一个包
foo
,则可以在其目录中包含一个
csv.py
。一个有用的做法是为脚本命名,其中包含Python模块中找不到的字符。例如,
my csv.py
是一个完美的cromultent脚本名称,但它不能是一个模块,因为
import my csv
是一个语法错误。