You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:56:58