【问题标题】:python chain a list from a tsv filepython链一个tsv文件中的列表
【发布时间】:2014-04-07 09:03:19
【问题描述】:

我有这个 tsv 文件,其中包含一些链接路径,每个链接都由“;”分隔我想使用:

在下面的示例中,我们可以设置文件中的文本是分开的 我只想通读最后一列,它是以“14th”开头的路径

6a3701d319fc3754    1297740409  166    14th_century;15th_century;16th_century;Pacific_Ocean;Atlantic_Ocean;Accra;Africa;Atlantic_slave_trade;African_slave_trade    NULL
3824310e536af032    1344753412  88     14th_century;Europe;Africa;Atlantic_slave_trade;African_slave_trade  3
415612e93584d30e    1349298640  138    14th_century;Niger;Nigeria;British_Empire;Slavery;Africa;Atlantic_slave_trade;African_slave_trade

我想以某种方式将路径拆分成这样的链:

['14th_century', 'Niger', 'Nigeria'....] 

我如何读取文件并删除前 3 列所以我只得到最后一列?

更新:

我现在已经试过了:

import re
with open('test.tsv') as f:
    lines = f.readlines()
for line in lines[22:len(lines)]:
    re.sub(r"^\s+", " ", line, flags = re.MULTILINE)
    e_line = line.split(' ')
    real_line = e_line[0]
    print real_line.split(';')

但问题是它没有删除前 3 列?

【问题讨论】:

    标签: python line chain tsv


    【解决方案1】:

    如果第一个分隔符只是一个空格而不是一系列空格或制表符,您可以这样做

    with open('file_name') as f:
        lines = f.readlines()
    for line in lines:
        e_line = line.split(' ')
        real_line = e_line[3]
        print real_line.split(';')
    

    【讨论】:

    • 它给了我一个超出范围的列表索引。我尝试在 real_line 中使用 0,它完成了工作,但它没有删除前 3 个制表符分隔的列?
    【解决方案2】:

    回答您更新的问题。

    但问题是它没有删除前 3 列?

    有几个错误。

    您的代码:

    import re
    with open('test.tsv') as f:
        lines = f.readlines()
    for line in lines[22:len(lines)]:
        re.sub(r"^\s+", " ", line, flags = re.MULTILINE)
        e_line = line.split(' ')
        real_line = e_line[0]
        print real_line.split(';')
    

    这条线什么都不做……

    re.sub(r"^\s+", " ", line, flags = re.MULTILINE)
    

    因为re.sub 函数不会更改您的line 变量,而是返回 替换字符串。 因此,您可能需要执行以下操作。

    line = re.sub(r"^\s+", " ", line, flags = re.MULTILINE)
    

    您的正则表达式 ^s\+ 仅匹配以空格或制表符开头的字符串。因为你使用^。 但我认为您只想用一个空格替换连续的空格或制表符。 那么,上面的代码将如下所示。(只需删除正则表达式中的^

    line = re.sub(r"\s+", " ", line, flags = re.MULTILINE)
    

    现在,行中的每个字符串仅分隔一个空格。所以line.split(' ') 会按照你的意愿工作。

    接下来,e_line[0] 返回e_line 的第一个元素,它是该行的第一列。 但是您想跳过前 3 列并获得第 4 列。你可以这样做:

    e_line = line.split(' ')
    real_line = e_line[3]
    

    好的。现在整个代码是这样的。

    for line in lines:#<---I also changed here because there is no need to skip first 22 lines in your example.
        line = re.sub(r"\s+", " ", line)
        e_line = line.split(' ')
        real_line = e_line[3]
        print real_line
    

    输出:

    14th_century;15th_century;16th_century;Pacific_Ocean;Atlantic_Ocean;Accra;Africa;Atlantic_slave_trade;African_slave_trade
    14th_century;Europe;Africa;Atlantic_slave_trade;African_slave_trade
    14th_century;Niger;Nigeria;British_Empire;Slavery;Africa;Atlantic_slave_trade;African_slave_trade
    

    附注:

    这一行可以变得更加pythonic。

    之前:

    for line in lines[22:len(lines)]:
    

    之后:

    for line in lines[22:]:
    

    而且,您不需要使用flags = re.MULTILINE,因为line 在for 循环中是单行的。

    【讨论】:

      【解决方案3】:

      您不需要为此使用正则表达式。 csv module 也可以处理制表符分隔的文件:

      import csv
      
      filereader = csv.reader(open('test.tsv', 'rb'), delimiter='\t')
      path_list = [row[3].split(';') for row in filereader]
      
      print(path_list)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-13
        • 1970-01-01
        • 2018-12-13
        • 2023-01-18
        • 1970-01-01
        • 2021-10-22
        • 2014-05-14
        • 1970-01-01
        相关资源
        最近更新 更多