在python中读取带有制表符和分号的文本文件

2024-06-02 12:21:20 发布

您现在位置:Python中文网/ 问答频道 /正文

在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

Tags: 方法idtargetmatchlineorder制表符unknown
2条回答

将正则表达式模式'\t|;'^{}一起使用:

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']

模式匹配一个制表符一个分号(这就是|的意思),因此输入字符串在这两个字符中的任何一个上被拆分。在

另一种方法是使用^{},并将sep设置为相同的reg ex模式。在

正如@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模块的需要:

^{pr2}$

相关问题 更多 >