python链从tsv文件中列出一个列表

时间:2014-04-07 09:03:19

标签: python line chain tsv

我有这个tsv文件包含一些链接路径,每个链接由一个';'分隔。我想用:

在下面的示例中,我们可以看到文件中的文本是分开的 我只想阅读最后一栏,这是一条以第14'开头的路径。

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列?

3 个答案:

答案 0 :(得分:2)

如果第一个之间的分隔符只是一个空格而不是一系列空格或制表符,那么你可以这样做

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(';')

答案 1 :(得分:1)

回答您的最新问题。

  

但问题是它没有删除前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

<强> P.S:

这条线可以变得更加pythonic。

之前:

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

后:

for line in lines[22:]:

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

答案 2 :(得分:1)

您不需要为此使用正则表达式。 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)