Python文本处理:如何将非'id:'开头的行追加至前一行
问题解决:合并文本文件中非起始行到前一行
问题背景
源文件内容:
uuid;UserGroup;Name;Description;Owner;Visibility;Members ----> header of the file id:;group1;raji;xyzabc;ramya;public; abc def geh id:group2;raji;rtyui;ramya;private cvb nmh poi
用户使用的代码逻辑有误,当前错误输出:
id;group1;raji;xyzabc;ramya;public;uuid;UserGroup;Name;Description;Owner;Visibility;Members id:group2;raji;rtyui;ramya;private;abc,def,geh
期望实现:保留表头,将所有不以id:开头的行追加到前一行末尾,最终输出:
uuid;UserGroup;Name;Description;Owner;Visibility;Members ----> header of the file id:;group1;raji;xyzabc;ramya;public;abc,def,geh id:group2;raji;rtyui;ramya;private;cvb,nmh,poi
错误原因分析
- 表头未单独处理:代码未区分表头行,导致表头被错误合并到第一行数据中
- 条件判断无效:
if not line.startswith('id:') and not None逻辑冗余,and not None永远为真,且表头行也会被判定为非id:行存入临时列表 - CSV写入方式错误:
writer.writerows(output)会将字符串拆分为字符列表写入,导致格式混乱
修正后的代码
output = [] temp = [] # 读取并处理文件 with open('usergroups.csv', 'r') as fo: lines = fo.readlines() if lines: # 单独处理表头 header = lines[0].strip() output.append(header) # 从第二行开始处理数据行 for line in lines[1:]: line = line.strip() if not line: continue # 跳过空行 if line.startswith('id:'): # 合并临时存储的附加内容到上一行 if temp: last_line = output.pop() last_line += ";" + ",".join(temp) output.append(last_line) temp.clear() output.append(line) else: # 存储非id开头的附加行 temp.append(line) # 处理最后一组未合并的附加内容 if temp: last_line = output.pop() last_line += ";" + ",".join(temp) output.append(last_line) # 打印结果 print("\n".join(output)) # 写入新文件 with open('new.csv', 'w') as f: f.write("\n".join(output))
代码说明
- 表头单独提取:直接将第一行作为表头加入输出列表,避免参与数据行的合并逻辑
- 合并逻辑修正:遇到
id:开头的行时,先合并之前存储的附加内容到上一行,再将当前行加入输出;非id:行存入临时列表等待合并 - 收尾处理:循环结束后,检查临时列表是否有剩余内容,确保最后一组附加行被合并
- 写入优化:直接按行写入处理后的内容,避免CSV工具的格式拆分问题
内容的提问来源于stack exchange,提问作者Lechu
相关产品推荐
相关产品推荐

