有没有办法在python中读取带制表符和分号分隔符的表?
该表如下所示:
chr1 match 158337 160567 . - . fam=LINE;Target=RIL 356 2619;ID=RIL-map20;Order=TE;Class=Unknown;Identity=93.9881;Name=chr1_RIL-Map20
答案 0 :(得分:1)
将正则表达式模式'\t|;'
与re.split()
:
import re
s = 'chr1\tmatch\t158337\t160567\t.\t-\t.\tfam=LINE;Target=RIL 356 2619;ID=RIL-map20;Order=TE;Class=Unknown;Identity=93.9881;Name=chr1_RIL-Map20'
l = re.split('\t|;', s)
>>> l
['chr1', 'match', '158337', '160567', '.', '-', '.', 'fam=LINE', 'Target=RIL 356 2619', 'ID=RIL-map20', 'Order=TE', 'Class=Unknown', 'Identity=93.9881', 'Name=chr1_RIL-Map20']
模式匹配单个选项卡或一个分号(这就是|
的含义),因此输入字符串将拆分为这两个字符。
另一种方法是使用pandas.read_csv()
sep
设置为相同的注册模式。
答案 1 :(得分:0)
正如@mhawke所指出的那样,我使用csv
模块的原始解决方案错过了要求,即分为\t
和;
。
import csv
import itertools
data = ['chr1\tmatch\t158337\t160567\t.t-t.tfam=LINE;Target=RIL 356 2619;ID=RIL-map20;Order=TE;Class=Unknown;Identity=93.9881;Name=chr1_RIL-Map20']
reader = csv.reader(data, delimiter='\t')
record = [i for i in itertools.chain(*[i for i in
(j for row in reader
for item in row
for j in csv.reader([item], delimiter=';'))])]
print(record)
# ['chr1', 'match', '158337', '160567', '.t-t.tfam=LINE', 'Target=RIL 356 2619', 'ID=RIL-map20', 'Order=TE', 'Class=Unknown', 'Identity=93.9881', 'Name=chr1_RIL-Map20']
我喜欢使用csv
模块,因为它利用了该模块中的所有功能。
现在我花了一点时间思考它,我重写了它以摆脱itertools
模块的需要:
import csv
data = ['chr1\tmatch\t158337\t160567\t.t-t.tfam=LINE;Target=RIL 356 2619;ID=RIL-map20;Order=TE;Class=Unknown;Identity=93.9881;Name=chr1_RIL-Map20']
reader = csv.reader(data, delimiter='\t')
record = [i for i in (k for row in reader
for item in row
for j in csv.reader([item], delimiter=';')
for k in j)]
print(record)
# ['chr1', 'match', '158337', '160567', '.t-t.tfam=LINE', 'Target=RIL 356 2619', 'ID=RIL-map20', 'Order=TE', 'Class=Unknown', 'Identity=93.9881', 'Name=chr1_RIL-Map20']