如何使用Python将非规整student.txt数据按规则写入结构化student.csv?
实现方案
思路说明
- 逐行读取原始txt文件,对每行做清洗:去除首尾空白、末尾多余逗号
- 用临时变量存储当前正在处理的name、对应的sibling列表、hobby列表
- 每次读取到新的
name->条目时,先将上一个name的所有关联数据写入csv,再重置临时变量存储新的name - 所有行读取完成后,手动写入最后一个name的关联数据,避免遗漏
- 写入时如果对应字段没有数据,统一填
N/A;如果有多个值,按预期格式分行展示,非首行的对应前序列留白处理
完整实现代码
import csv # 初始化临时存储变量 current_name = None current_siblings = [] current_hobbies = [] # 读取txt文件,清洗每行格式 with open('student.txt', 'r', encoding='utf-8') as txt_file: lines = [line.strip().rstrip(',') for line in txt_file if line.strip()] # 写入csv文件 with open('student.csv', 'w', encoding='utf-8', newline='') as csv_file: writer = csv.writer(csv_file) # 写入表头 writer.writerow(['Name', 'Sibling', 'Hobbies']) for line in lines: # 遇到新的name条目,先写入上一个name的全量数据 if line.startswith('name->'): if current_name is not None: # 计算当前name对应的行数,取sibling和hobby的数量最大值 max_rows = max(len(current_siblings), len(current_hobbies), 1) for i in range(max_rows): name_col = current_name if i == 0 else '' sibling_col = current_siblings[i] if i < len(current_siblings) else ('N/A' if i == 0 and len(current_siblings) == 0 else '') hobby_col = current_hobbies[i] if i < len(current_hobbies) else ('N/A' if i == 0 and len(current_hobbies) == 0 else '') writer.writerow([name_col, sibling_col, hobby_col]) # 重置临时变量存储新的name current_name = line current_siblings = [] current_hobbies = [] elif line.startswith('sibling->'): current_siblings.append(line) elif line.startswith('hobby_'): current_hobbies.append(line) # 写入最后一个name的全量数据 if current_name is not None: max_rows = max(len(current_siblings), len(current_hobbies), 1) for i in range(max_rows): name_col = current_name if i == 0 else '' sibling_col = current_siblings[i] if i < len(current_siblings) else ('N/A' if i == 0 and len(current_siblings) == 0 else '') hobby_col = current_hobbies[i] if i < len(current_hobbies) else ('N/A' if i == 0 and len(current_hobbies) == 0 else '') writer.writerow([name_col, sibling_col, hobby_col])
效果说明
使用Python内置csv模块写入避免分隔符冲突,兼容性更强,最终输出的csv完全匹配你给出的预期格式:无对应值的字段自动填N/A,同组多值条目前列自动留空,格式对齐规整。
内容的提问来源于stack exchange,提问作者SirCuddles
相关产品推荐
相关产品推荐

