Python中如何逐行读取.txt文件并处理关联.shp文件?
问题分析与解决方案
你的核心问题是每行县名末尾的换行符导致shapefile路径无效,进而让gdal.OpenEx返回None,调用ExecuteSQL时触发NoneType错误。以下是具体修复步骤和优化后的代码:
关键修复点
- 去除换行符与多余空白:使用
strip()方法清除每行末尾的换行符及可能存在的前后空格(若县名含前导零如001-almeda,strip()不会破坏格式)。 - 更高效的逐行读取:直接迭代文件对象而非
readlines(),既节省内存又避免额外的列表生成。 - 添加有效性检查:在操作
source_ds前确认其不为None,避免因文件不存在或路径错误导致崩溃。 - 更清晰的路径拼接:使用f-string替代字符串拼接,提升代码可读性。
修复后的代码
from osgeo import gdal with open('/Users/deas/Documents/Python/precinct-master/full-list.txt') as county_file: for county in county_file: # 去除换行符及前后空白字符 county_clean = county.strip() if not county_clean: # 跳过空行 continue # 构建shapefile路径 shp_path = f'/Users/deas/Documents/Python/precinct-master/data/shapefiles/{county_clean}.shp' # 打开矢量文件并检查是否成功 source_ds = gdal.OpenEx(shp_path, gdal.OF_VECTOR | gdal.OF_UPDATE) if not source_ds: print(f"无法打开文件: {shp_path}") continue # 执行SQL删除列 try: source_ds.ExecuteSQL(f"ALTER TABLE {county_clean} DROP COLUMN isHill") print(f"成功处理县: {county_clean}") except Exception as e: print(f"处理{county_clean}时出错: {str(e)}") finally: # 释放数据集资源 source_ds = None
额外说明
- 若你的县名格式严格为
数字-县名(如001-almeda),strip()不会改变其格式,可放心使用。 - 添加空行跳过逻辑,避免因文本文件末尾的空行导致无效路径。
finally块确保数据集资源被正确释放,防止内存泄漏。
内容的提问来源于stack exchange,提问作者The Mad Scientist
相关产品推荐
相关产品推荐

