Python代码报错:_csv.reader与str无法执行+运算,求卢恩校验位生成方案
解决TypeError: unsupported operand type(s) for +: '_csv.reader' and 'str'错误
错误根源
调用luhn_calculate(f1_read)时,传入的f1_read是csv.reader对象,而函数luhn_calculate内部执行partcode + "0",试图将阅读器对象与字符串拼接,直接触发类型不匹配错误。此外代码还存在多处逻辑问题,一并修正。
代码问题梳理
- 卢恩算法函数定义在
for循环内部,会重复定义造成资源浪费,完全没必要。 luhn_checksum函数中return total_sum % 10缩进错误,写在for循环内导致第一次迭代就返回结果,计算逻辑完全错误。- 校验函数调用时,传参为
csv.reader对象而非循环中提取的ICCID字符串code。 - 代码后半部分的
res.read()、sub_id等变量无意义,res是计算出的校验位数字,并非HTTP响应对象,属于冗余代码。 - 文件操作逻辑混乱,同时打开多个文件但未合理使用。
修正后的完整代码
import csv import pandas as pd # 提前定义卢恩算法相关函数,置于循环外部 def luhn_checksum(code): length = len(code) parity = length % 2 total_sum = 0 for i in range(length-1, -1, -1): d = int(code[i]) if i % 2 == parity: d *= 2 if d > 9: d -= 9 total_sum += d # 修正return缩进,确保遍历所有数字后返回校验和 return total_sum % 10 def luhn_calculate(partcode): checksum = luhn_checksum(partcode + "0") return 0 if checksum == 0 else 10 - checksum def luhn_validate(full_code): return luhn_checksum(full_code) == 0 cols = ['原始ICCID', '带校验位的完整ICCID', '校验结果'] lst = [] input_file = "1.txt" output_excel = "Output_1397.xlsx" # 读取输入文件中的ICCID数据 with open(input_file, 'r') as f1: reader = csv.reader(f1) for row in reader: raw_iccid = row[0].strip() # 跳过非数字格式的无效ICCID if not raw_iccid.isdigit(): print(f"跳过无效ICCID:{raw_iccid}") continue # 计算校验位并生成完整ICCID check_digit = luhn_calculate(raw_iccid) full_iccid = raw_iccid + str(check_digit) # 验证完整ICCID的合法性 is_valid = luhn_validate(full_iccid) # 将结果存入列表用于生成Excel lst.append([raw_iccid, full_iccid, "有效" if is_valid else "无效"]) # 生成输出Excel文件 df1 = pd.DataFrame(lst, columns=cols) df1.to_excel(output_excel, index=False) print(f"处理完成!结果已保存到 {output_excel}")
修正说明
- 将卢恩算法函数移至循环外部,避免重复定义。
- 修复
luhn_checksum函数的return缩进问题,确保遍历所有数字后计算校验和。 - 调用校验函数时传入循环提取的
raw_iccid字符串,而非csv.reader对象。 - 移除冗余的
http.client、uuid等无关模块及无效代码。 - 优化输出逻辑,生成包含原始ICCID、完整ICCID和校验结果的Excel文件,结果更直观。
- 添加格式校验,自动跳过非数字的无效ICCID条目。
内容的提问来源于stack exchange,提问作者sagar
相关产品推荐
相关产品推荐

