执行python manage.py cities_light报ValueError: invalid literal for int() with base 10: ''错误
问题根因
该报错核心是ValueError: invalid literal for int() with base 10: '',从调用栈可以定位到:导入国家数据时,程序尝试将countryInfo.txt文件里的geonameid字段值转为整数用于数据库查询,但该字段某行的值是空字符串,无法完成转换导致程序崩溃。
排查步骤
- 找到django-cities-light的本地缓存目录:默认是系统临时目录下的
cities_light文件夹,也可以通过项目配置项CITIES_LIGHT_DATA_DIR自定义路径,打开该目录下的countryInfo.txt文件,检查是否存在geonameid列为空的行 - 确认当前安装的django-cities-light版本,排查是否为旧版本存在空值兼容缺陷
解决方法
- 方法1:强制刷新缓存重新拉取数据
运行导入命令时添加--force-all参数,跳过本地缓存直接拉取最新的官方地理数据:
python manage.py cities_light --force-all
- 方法2:升级依赖包到最新稳定版
旧版本的django-cities-light对异常数据的容错处理不完善,直接升级包即可:
pip install --upgrade django-cities-light
方法3:手动修复异常数据
如果重新拉取数据后仍存在问题,打开本地缓存的countryInfo.txt,找到geonameid为空的行,直接删除该行或者补充合法的非重复数字id,保存后重新运行导入命令。方法4:临时添加空值跳过逻辑(仅作为临时应急方案)
找到报错的文件cities_light/management/commands/cities_light.py,在country_import方法中查询Country对象的代码前,添加空值判断逻辑:
# 加在 country = Country.objects.get(geoname_id=items[ICountry.geonameid]) 之前 if not items[ICountry.geonameid]: self.logger.warning(f"跳过geonameid为空的异常数据行:{items}") return
修改保存后重新运行导入命令即可自动跳过异常行。
内容的提问来源于stack exchange,提问作者Khalid Butt
相关产品推荐
相关产品推荐

