旧版Jython无csv模块时,如何转置制表符分隔文件内容?
如何在无csv模块的Jython中转置TSV文件?
我原本用以下代码实现制表符分隔(TSV)文件的转置,但当前使用的旧版Jython不包含csv模块,请问如何在不使用csv模块的前提下实现该功能?
原TSV内容:
Xkr4 0 0 0 0 Gm1992 0 0 0 0 Gm37381 0 0 0 0 Rp1 0 0 0 0 Rp1.1 0 0 0 0 Sox17 0 0 0 0原代码(依赖csv模块):
f=open(tsv_path, 'r') transposed_iterator = zip(*csv.reader(open(tsv_path), delimiter = '\t')) with open(output_tsv_path, 'w') as out: for row in transposed_iterator: out.write(delimiter.join(row) + '\n')预期转置结果:
Xkr4 Gm1992 Gm37381 Rp1 Rp1.1 Sox17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
没问题,咱们可以手动处理TSV的分隔和转置,完全不需要csv模块。核心思路就是自己按制表符拆分每一行,再用zip(*...)这个经典技巧实现转置,最后把转置后的行用制表符拼接回去就行。
下面是具体的代码实现:
tsv_path = "your_input.tsv" output_tsv_path = "your_output.tsv" delimiter = "\t" # 读取文件并手动拆分每一行 with open(tsv_path, 'r') as infile: # 逐行读取,去掉换行符后按制表符拆分成列表 rows = [line.rstrip('\n').split(delimiter) for line in infile] # 转置行和列:zip(*rows)会把原二维列表的列打包成新的行 transposed_rows = zip(*rows) # 写入转置后的内容 with open(output_tsv_path, 'w') as outfile: for row in transposed_rows: # 用制表符拼接元素成一行,加上换行符写入 outfile.write(delimiter.join(row) + '\n')
简单解释下代码逻辑:
- 读取并拆分行:打开输入文件后,逐行处理——先去掉每行末尾的换行符,再用制表符拆分成字段列表,这样就得到了和
csv.reader输出一致的二维列表结构。 - 转置操作:
zip(*rows)是Python/Jython里实现二维列表转置的常用方法,它会把原列表的每一列转换成新的行。 - 写入结果:遍历转置后的每一行,用制表符把字段拼接成字符串,再写入输出文件即可。
注意事项:
- 如果你的TSV文件存在字段内包含制表符的情况(不符合标准TSV规范,但万一遇到),这个方法会出错;但如果是标准TSV(字段不含制表符),效果和原csv模块实现完全一致。
- 旧版Jython中
zip可能返回列表而非迭代器,但这不影响遍历使用,逻辑是通的。
内容的提问来源于stack exchange,提问作者money
相关产品推荐
相关产品推荐

