【问题标题】:How to parse tsv file with python?如何用python解析tsv文件?
【发布时间】:2017-02-21 03:43:28
【问题描述】:

我有一个包含一些换行数据的 tsv 文件。

111 222 333 "aaa"
444 555 666 "bb
b"

这里第三行的b是第二行bb的换行符,所以它们是一个数据:

第一行的第四个值:

aaa

第二行第四个值:

bb
b

如果我使用 Ctrl+C 和 Ctrl+V 粘贴到 excel 文件,效果很好。但是如果我想用python导入文件,怎么解析呢?

我试过了:

lines = [line.rstrip() for line in open(file.tsv)]
for i in range(len(lines)):
    value = re.split(r'\t', lines[i]))

但结果并不好:

我想要:

【问题讨论】:

  • 不确定你的意思:“这里第三行的 b 是 bb 的换行符”

标签: python csv


【解决方案1】:

只需使用csv module。它知道 CSV 文件中所有可能的极端情况,例如引用字段中的新行。它可以在制表符上分隔。

with open("file.tsv") as fd:
    rd = csv.reader(fd, delimiter="\t", quotechar='"')
    for row in rd:
        print(row)

会正确输出:

['111', '222', '333', 'aaa']
['444', '555', '666', 'bb\nb']

【讨论】:

    【解决方案2】:
    import pandas as pd
    data = pd.read_csv ("file.tsv", sep = '\t')
    

    【讨论】:

    • 另外值得一提的是,如果您的文件中没有标题,请添加 header=None 否则它可能会使用第一行作为标题
    【解决方案3】:

    在 .tsv/.csv 的内容(单元格)中的换行符通常用引号括起来。如果不是,标准解析可能会将其混淆为下一行的开始。在你的情况下,行

    for line in open(file.tsv)
    

    自动使用换行符作为分隔符。

    如果您确定文件只有 4 列,您可以简单地阅读整个文本,根据选项卡将其拆分,然后一次拉出 4 个项目。

    # read the entire text and split it based on tab
    old_data = open("file.tsv").read().split('\t')
    
    # Now group them 4 at a time
    # This simple list comprehension creates a for loop with step size = num. of columns
    # It then creates sublists of size 4 (num. columns) and puts it into the new list
    new_data = [old_data[i:i+4] for i in range(0, len(old_data), 4)]
    

    理想情况下,您应该关闭引号中可能包含换行符的内容。

    【讨论】:

    • 非常感谢。是的,真实数据是双引号的。我已经编辑了主题。我会读你的方法。
    【解决方案4】:
    import scipy as sp
    data = sp.genfromtxt("filename.tsv", delimiter="\t")
    

    【讨论】:

    • 解释会有所帮助。但从我有限的知识来看,这确实似乎是一个好方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 2021-01-21
    • 2014-12-10
    • 1970-01-01
    • 2021-10-08
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多