从TSV换到CSV
大约 3 分钟
此前写代码组织文件,我非常喜欢用TSV这种格式,也就是用Tab分隔,类似bed格式。因为这种格式在terminal里面显示比较整齐,某一列看起来很规整。csv格式相对来说直接看排版就很乱,再加上字符其实差不多,所以没怎么用。但是我最近发现TSV写文件对于缺失值可能会存在一定不好处理的bug。这个博客整理一下我发现的东西,之后看来需要多用CSV格式了。
- TSV,BED和CSV
- TSV的BUG
- 后记
TSV,BED和CSV
TSV、bed 和 CSV 是三种常见的文本文件格式,用于存储表格数据。以下是这三种格式的区别:
TSV (Tab-Separated Values)
- 如其名所示,TSV 格式使用制表符(tab)作为字段之间的分隔符。
- 例如:
名字 年龄 地址 张三 25 北京 李四 30 上海
- TSV 格式常用于某些程序,如 Excel 和数据库导入/导出功能,因为它们可以很好地处理包含逗号的数据。
bed (Browser Extensible Data)
- bed 格式是一种用于描述基因组数据的文件格式,特别是在生物信息学中。
- 它通常包含至少三列:染色体名、起始位置和结束位置。但也可以包含更多的列,如名称、分数、链方向等。
- 例如:
chr1 100 200 chr1 150 250
- 注意:bed 格式的坐标是0-based和半开放的,这意味着起始位置是包括的,但结束位置是不包括的。
CSV (Comma-Separated Values)
- CSV 格式使用逗号作为字段之间的分隔符。
- 例如:
名字,年龄,地址 张三,25,北京 李四,30,上海
- CSV 是最常用的数据交换格式之一,特别是在数据分析和数据科学领域。
- 但是,如果数据本身包含逗号,那么这可能会导致混淆。为了解决这个问题,通常会使用双引号来包围包含逗号的字段。
总结:TSV 和 CSV 都是用于存储表格数据的通用格式,而 bed 格式特定于基因组数据。选择哪种格式取决于你的具体需求和你正在使用的工具。
TSV的BUG
我在处理一些有缺失值的数据发现TSV可能会漏掉最后的空行。下面是详细的展示:
a=""
b="2"
c="3"
d=""
print("\t".join([a,b,c,d]))
print("\t".join([a,b,c,d]).split("\t"))
print("\t".join([a,b,c,d]).strip().split("\t"))
OUTPUT:
2 3 # 可以看到正常输出
['', '2', '3', ''] # 这是正常split
['2', '3'] #如果习惯性加了strip()去空格就少了2个值
上面可以看到,直接join和split是没问题的,除非不小心加了strip。其实最大的bug在于读写文件:
a=""
b="2"
c="3"
d=""
with open("test.txt","w") as out:
out.write("\t".join([a,b,c,d])+ "\n")
with open("./test.txt","r") as f:
print(f.read().strip().split("\t"))
with open("./test.txt","r") as f:
print(f.read().split("\t"))
OUTPUT:
['2', '3'] #一般读文件我们会习惯性加strip,于是首尾的缺失值就被删了
['', '2', '3', '\n'] #这个最夸张,就算不加strip,最后一个值也被trim掉了
如果加strip,不用说缺失值就被删了。 不过不加strip,最后一个缺失值也被认为不存在。
因为通常BED格式要求对的很齐,所以某个值消失了就会错位,因为逻辑BUG。