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

Python中如何逐行读取.txt文件并处理关联.shp文件?

问题分析与解决方案

你的核心问题是每行县名末尾的换行符导致shapefile路径无效,进而让gdal.OpenEx返回None,调用ExecuteSQL时触发NoneType错误。以下是具体修复步骤和优化后的代码:

关键修复点

  1. 去除换行符与多余空白:使用strip()方法清除每行末尾的换行符及可能存在的前后空格(若县名含前导零如001-almeda,strip()不会破坏格式)。
  2. 更高效的逐行读取:直接迭代文件对象而非readlines(),既节省内存又避免额外的列表生成。
  3. 添加有效性检查:在操作source_ds前确认其不为None,避免因文件不存在或路径错误导致崩溃。
  4. 更清晰的路径拼接:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:12:54