You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何不借助第三方包用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

火山引擎 最新活动