我有这个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列?
答案 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)