Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中读取带有制表符和分号的文本文件_Python - Fatal编程技术网

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

在python中读取带有制表符和分号的文本文件,python,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 使用正则表达式模式“\t |”带有: 模式匹配一个制表符或一个分号(这就是|的意思),因此输入字符串被拆分为这

在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

使用正则表达式模式
“\t |”带有:

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


另一种方法是将
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
模块的需求:

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

我会这么想的!您尝试了什么,它到底有什么问题?除了CSV模块之外,请查看
split
:我认为OP需要在同一行上用制表符和分号分隔的列。这个答案对其中一个有用。谢谢你的回答。
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']