使用Python 3解析含冒号分隔符的.txt文件遇问题求助
问题分析与解决方案
嘿,我来帮你排查这个问题~
为什么你的代码没生效?
你的代码里犯了一个常见的小错误:csv.reader默认是用逗号作为分隔符来解析文件的,但你的源文件里根本没有逗号,所以每一行都会被当成一个完整的字符串(也就是单个“单元格”)塞进列表里。之后用csv.writer以冒号为分隔符写入这个列表时,因为列表只有一个元素,自然不会做任何拆分,所以新文件和原文件完全一样。
针对你需求的解决方案
根据你给出的示例内容(一行包含多个空格分隔的键:值对),我给你两种常见场景的解决方案:
场景1:把每个键:值对拆成单独的行(每行两列)
如果你想把16A:0617XXXXX 17B:560-L 18C:AID0005345转换成三行,每行是键和值两个单元格,可以用这段代码:
import csv with open('/u/ISIN.txt', 'r') as ISIN_file: with open('/u/ISIN_new.txt', 'w') as ISIN_file_new: # 用制表符作为新分隔符,方便后续用Excel/表格工具打开 csv_writer = csv.writer(ISIN_file_new, delimiter='\t') for line in ISIN_file: # 去掉换行符和首尾空格 cleaned_line = line.strip() if not cleaned_line: continue # 跳过空行 # 按空格拆分出每个键值对 key_value_pairs = cleaned_line.split() for pair in key_value_pairs: # 只拆分第一个冒号,避免值里有冒号的情况 key, value = pair.split(':', 1) csv_writer.writerow([key, value])
场景2:如果每行只有单个键:值对
要是你的文件每行就是单独的键:值(比如每行只有16A:0617XXXXX),可以简化成这段代码:
import csv with open('/u/ISIN.txt', 'r') as ISIN_file: with open('/u/ISIN_new.txt', 'w') as ISIN_file_new: csv_writer = csv.writer(ISIN_file_new, delimiter='\t') for line in ISIN_file: cleaned_line = line.strip() if not cleaned_line: continue # 拆分第一个冒号 parts = cleaned_line.split(':', 1) csv_writer.writerow(parts)
小提示
- 用
split(':', 1)而不是直接split(':')是为了防坑:如果你的值里面碰巧包含冒号,这个写法只会拆分第一个冒号,保证键和值的正确性。 - 新文件的分隔符我用了制表符
\t,你也可以换成逗号,,看你后续用什么工具处理数据。
内容的提问来源于stack exchange,提问作者J. J. Jay
相关产品推荐
相关产品推荐

