Python实现TSP:导入CSV城市坐标数据报错求助
Hey there! Let's fix those CSV import issues for your TSP project step by step.
解决TSP项目中自定义CSV坐标导入的核心问题
问题拆解
你碰到的两个关键障碍:
- UTF-8 BOM头干扰:CSV文件开头的
是UTF-8 BOM标记,Python默认读取时不会自动处理,导致表头变成x,无法转换为浮点数。 - 小数分隔符为逗号:你的CSV用逗号表示小数(比如
48,8582),但Python的csv模块默认把逗号当列分隔符,直接读取会导致坐标值被拆分或无法转成数值类型。
修正后的CSV加载函数
下面是同时解决两个问题的代码实现,替换你原来的Cities函数即可:
import csv def load_cities_from_csv(file_path): cities = [] # 用utf-8-sig编码打开文件,自动移除UTF-8 BOM头 with open(file_path, 'r', encoding='utf-8-sig') as csv_file: # 假设你的CSV用分号分隔列(因为小数用了逗号),如果列分隔符是其他符号(比如制表符),请修改delimiter值 csv_reader = csv.reader(csv_file, delimiter=';', quoting=csv.QUOTE_NONE) # 跳过表头行(如果你的CSV第一行是x、y表头的话) next(csv_reader) for row in csv_reader: # 将逗号小数分隔符替换为Python默认的点,再转换为浮点数 x_coord = float(row[0].replace(',', '.')) y_coord = float(row[1].replace(',', '.')) cities.append((x_coord, y_coord)) return cities
关键细节说明
- 处理BOM头:
encoding='utf-8-sig'会自动识别并移除文件开头的BOM标记,确保表头x、y能被正常读取。 - 处理小数分隔符:
- 先确认你的CSV列分隔符——因为小数用了逗号,列分隔符通常是分号(
;),所以在csv.reader里指定delimiter=';'。如果你的列分隔符是空格或其他符号,记得对应修改。 - 读取每个坐标值后,把逗号替换为点(
.),再转换为浮点数,这样48,8582就能变成48.8582,符合Python的数值格式要求。
- 先确认你的CSV列分隔符——因为小数用了逗号,列分隔符通常是分号(
测试调用
使用时直接传入你的CSV文件路径即可:
# 替换成你的CSV文件实际路径 my_cities = load_cities_from_csv('custom_cities.csv') print(my_cities) # 打印验证坐标是否正确加载
如果你的CSV没有表头(第一行就是坐标数据),记得删除代码里的next(csv_reader)这一行。
内容的提问来源于stack exchange,提问作者twinks-
相关产品推荐
相关产品推荐

