自动排序txt转csv积分值的Python脚本运行异常问题求助
错误原因及修复方案
你的脚本无法排序的核心问题是索引取值错误,另外还有多处逻辑可优化:
- 索引越界:你提供的示例行用
|拆分后仅包含2个元素,索引从0开始计数时,积分类内容存在索引为1的位置,原脚本直接访问minNum[4]会直接触发异常,所有行都会被归入未排序的endlines列表,自然没有排序效果 - 冗余类型转换:你已经在try代码块中将积分转为int类型,排序时不需要再做一次类型转换
- 资源未正确释放:读取txt文件时没有使用上下文管理器,文件句柄不会自动关闭,可能导致后续操作异常
- 写入模式不合理:使用
a+追加模式会导致多次运行脚本时,同一个输出文件的内容不断重复追加,建议用w覆盖模式 - 路径兼容性差:硬编码 Windows 风格的路径分隔符
\\无法在Linux/Mac系统运行,建议用os模块处理路径
修复后可直接运行的代码
import csv import glob import os # 自动创建输出文件夹,不存在就新建,存在也不会报错 os.makedirs("sorted", exist_ok=True) allTxtFiles = glob.glob("txt/*.txt") for t in allTxtFiles: # 用上下文管理器读文件,自动释放资源 with open(t, 'r', encoding='utf-8') as f: input_lines = f.readlines() unsorted_lines = [] sortable_lines = [] for line in input_lines: line = line.strip() # 跳过空行 if not line: continue # 按|最多拆分1次,避免内容本身包含|导致拆分错误 parts = line.split("|", 1) if len(parts) != 2: unsorted_lines.append(parts) continue try: # 提取并转换积分 points_str = parts[1].replace("PointsTotal = ", "").strip() points = int(points_str) # 存储格式为(排序用积分, 用户信息字段, 积分字段) sortable_lines.append((points, parts[0].strip(), points)) except: unsorted_lines.append(parts) # 按积分从高到低排序 sortable_lines.sort(key=lambda x: x[0], reverse=True) # 提取要写入csv的内容,去掉排序用的冗余字段 result_lines = [[item[1], item[2]] for item in sortable_lines] # 把不符合格式的行放在末尾 result_lines.extend(unsorted_lines) # 生成输出文件路径,兼容多系统 output_name = os.path.join("sorted", os.path.basename(t).replace(".txt", ".csv")) with open(output_name, 'w', newline="", encoding='utf-8') as outfile: writer = csv.writer(outfile) # 可选写入表头,不需要可以注释掉 writer.writerow(["用户信息", "总积分"]) writer.writerows(result_lines)
效果说明
运行后会自动读取txt文件夹下所有的txt文件,按积分降序排序后输出到sorted文件夹下对应名称的csv文件,不符合格式的行会统一放在文件末尾,不会丢失。
内容的提问来源于stack exchange,提问作者JacobJake7
相关产品推荐
相关产品推荐

