使用pygeoip调用GeoLite2-City.mmdb触发FileNotFoundError的原因
pygeoip加载GeoLite2-City.mmdb时的FileNotFoundError问题 看起来你遇到的是相对路径导致的文件找不到问题,我来帮你拆解原因和解决办法:
为什么会出现这个错误?
Python处理相对路径(比如'media/GeoLite2-City.mmdb')时,会以你执行脚本时的当前工作目录为基准查找文件,而不是以test.py所在的目录为基准。
举个实际例子:如果你的test.py在/Users/luowensheng/Desktop/TestIOS/TestPython/testDemo02/ipaddr/目录下,但你是在/Users/luowensheng/目录下执行脚本,Python会去/Users/luowensheng/media/GeoLite2-City.mmdb找文件,而非你预期的/Users/luowensheng/Desktop/TestIOS/TestPython/testDemo02/ipaddr/media/GeoLite2-City.mmdb,自然就触发了找不到文件的错误。
另外也可能是这些小细节出了问题:
- 文件名或目录名拼写错误(注意大小写,Mac默认不区分,但部分场景下会有兼容问题)
media目录确实不在脚本执行时的工作目录下
解决办法
这里给你几个靠谱的方案:
1. 使用脚本所在目录的绝对路径(最推荐)
通过__file__获取当前脚本的路径,再拼接media目录的路径,这样不管在哪里执行脚本都能精准找到文件:
from pygeoip import GeoIP import os def getLatLon(ip): # 获取当前脚本所在的绝对目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接mmdb文件的完整路径 db_path = os.path.join(script_dir, 'media', 'GeoLite2-City.mmdb') gi = GeoIP(db_path) data = gi.record_by_addr(ip) return data getLatLon("113.210.32.76")
2. 切换到脚本所在目录再执行
打开终端,先切换到test.py所在的目录:
cd /Users/luowensheng/Desktop/TestIOS/TestPython/testDemo02/ipaddr/
再执行脚本:
python test.py
此时相对路径会以这个目录为基准,就能正确找到media/GeoLite2-City.mmdb。
3. 检查文件路径和名称
确认media目录确实在test.py的同级目录下,文件名GeoLite2-City.mmdb没有拼写错误(比如不要写成GeoLite2-City.MMDB,代码里最好和实际文件名完全一致)。
内容的提问来源于stack exchange,提问作者1243916142

