如何准确判断一个文件是否为TSV文件?
如何准确判断一个文件是否为TSV文件?
这个问题和之前的一个讨论线程关联度很高,我最近也在琢磨怎么写个函数来判断输入文件是不是真的TSV格式——毕竟只靠file.endswith('.tsv')肯定不靠谱,随便把CSV或者分号分隔的文件改个后缀名就能蒙混过关。
举个例子,比如有这么一组表格数据:
| a | b | c |
|---|---|---|
| 1 | foo | 3.42 |
| bar | foo, bar |
在文本编辑器里,它的真实内容应该是用制表符分隔的:
a b c 1 foo 3.42 bar foo, bar
根据维基百科的定义:
TSV的规范是:记录之间用换行符分隔,同一条记录内的各个值用制表符(tab)分隔。
你提到的最小可行方案(MVP)——检查每行都以换行符结尾,且每行的制表符数量一致,这个思路方向是对的,但还有几个细节需要补充,不然可能会误判:
- 空行与特殊行的处理:如果文件里存在空行、注释行(比如以
#开头的行),这些行的制表符数量肯定和数据行不一致,需要先判断是否要跳过这类行再统计制表符数量,不然会直接判定为非TSV文件。 - 列数一致性校验:准确来说,应该是有效数据行的列数一致(列数=制表符数量+1),比如表头有2个制表符(对应3列),那每一行数据也应该有2个制表符,确保列数统一。
- 特殊字段的兼容:如果某个字段里包含换行符(严格规范下会用引号包裹),但实际场景中有些TSV可能没做这个处理,这种情况你的基础校验逻辑会失效,要不要处理这类极端情况,得看你的使用场景需求。
- 文件编码的坑:读取文件时如果用了错误的编码,可能会把制表符或者换行符解析成乱码,导致校验失败,所以最好先指定通用编码(比如UTF-8)来读取文件。
总的来说,你的核心思路没问题——验证行分隔符和字段分隔符的规范,但要结合实际场景补充一些边界情况的处理。如果是日常使用的轻量校验,那检查有效行的制表符数量一致、字段用制表符分隔,就足够覆盖大部分场景了;如果要做严格的合规校验,那还得考虑引号转义、特殊字符处理等更细节的规范。
备注:内容来源于stack exchange,提问作者Johannes Wiesner
相关产品推荐
相关产品推荐

