2014-04-07 28 views
1

我有這個TSV文件包含一些鏈接的路徑每個鏈接是由';'分隔的,我想使用:python從tsv文件中鏈接一個列表

在下面的例子中,我們可以SE,該文件中的文本被分隔 ,我只希望通過最後一列至極閱讀是一個路徑以「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列,所以我只拿到了最後一個?

UPDATE:

我已經試過這現在:

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

回答

2

如果分隔betweeen第一隻是一個空間,而不是空格或製表符意甲,你能做到這一點

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

它給了我一個列表索引超出範圍。我在real_line中嘗試了0,它做了這項工作,但它沒有刪除前3個選項卡分隔的列? –

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:

這條線可以變得更Python。

前:

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

後:

for line in lines[22:]: 

而且,你並不需要使用flags = re.MULTILINE,因爲line是單行的for循環。

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) 
相關問題