如何不借助第三方包用Python读取TSV文件并存储记录到列表
不用第三方库读取TSV文件并存储为列表记录
没问题!完全可以用Python内置的文件操作来搞定这个需求,不需要依赖csv、pandas这些第三方库。我分两种场景给你说明:
基础场景:TSV字段无特殊字符
如果你的TSV文件里的字段不包含制表符、换行符或者引号这类特殊内容,用最基础的文件读取+字符串分割就足够了:
records = [] # 用with语句打开文件,会自动帮你关闭文件,避免资源泄漏 with open('your_file.tsv', 'r', encoding='utf-8') as tsv_file: # 如果你需要跳过表头行,就加这一行;不需要的话直接注释掉 next(tsv_file) # 逐行读取文件 for line in tsv_file: # 先去掉每行末尾的换行符,再按制表符(\t)分割成字段列表 # 如果你想保留字段前后的空白,可以把strip()换成rstrip('\n') record = line.strip().split('\t') records.append(record) # 现在records就是存储了所有记录的大列表,每条记录是一个子列表 print(records)
进阶场景:TSV字段包含特殊字符
如果你的TSV文件里有字段被双引号包裹,且字段内部包含制表符、换行符这类内容(比如"user1\tadmin"或者"description\nwith\nlinebreaks"),上面的基础方法就会出错,这时候需要手动处理引号包裹的逻辑:
def parse_tsv_line(line): """解析带引号的TSV行,保留字段内的特殊字符""" fields = [] current_field = [] in_quotes = False # 标记是否处于引号包裹的状态 # 遍历每行的每个字符(先去掉末尾的换行符) for char in line.rstrip('\n'): if char == '"': # 遇到引号,切换是否在引号内的状态 in_quotes = not in_quotes elif char == '\t' and not in_quotes: # 遇到制表符且不在引号内,说明当前字段结束,加入列表 fields.append(''.join(current_field)) current_field = [] else: # 其他字符直接加入当前字段 current_field.append(char) # 把最后一个字段加入列表 fields.append(''.join(current_field)) return fields # 使用自定义解析函数读取文件 records = [] with open('your_file.tsv', 'r', encoding='utf-8') as tsv_file: next(tsv_file) # 跳过表头(按需选择) for line in tsv_file: record = parse_tsv_line(line) records.append(record)
注意事项
- 记得替换代码里的
your_file.tsv为你实际的文件路径 - 编码格式如果不是utf-8,可以改成对应的编码(比如gbk)
- 如果你的TSV用的是其他分隔符(比如空格?不过TSV标准是制表符),只需要把
'\t'换成对应的分隔符就行
内容的提问来源于stack exchange,提问作者abcdefg




