我正在使用python3的linux系统,其中包含遗传学常见的.psl
格式的文件。这是一个制表符分隔文件,其中包含一些逗号分隔值的单元格。下面是一个包含.psl某些功能的小示例文件。
input.psl
1 2 3 x read1 8,9, 2001,2002,
1 2 3 mt read2 8,9,10 3001,3002,3003
1 2 3 9 read3 8,9,10,11 4001,4002,4003,4004
1 2 3 9 read4 8,9,10,11 4001,4002,4003,4004
我需要过滤此文件以仅提取感兴趣的区域。在这里,我只提取第四列中值为9的行。
import csv
def read_psl_transcripts():
psl_transcripts = []
with open("input.psl") as input_psl:
csv_reader = csv.reader(input_psl, delimiter='\t')
for line in input_psl:
#Extract only rows matching chromosome of interest
if '9' == line[3]:
psl_transcripts.append(line)
return psl_transcripts
然后我需要能够以与制表符分隔的格式打印或写入这些选定的行,这些格式与输入文件的格式相匹配,而不添加其他引号或逗号。我似乎无法使这一部分正确,并且总是添加额外的括号,引号和逗号。以下是使用print()的尝试。
outF = open("output.psl", "w")
for line in read_psl_transcripts():
print(str(line).strip('"\''), sep='\t')
非常感谢任何帮助。以下是所需的输出。
1 2 3 9 read3 8,9,10,11 4001,4002,4003,4004
1 2 3 9 read4 8,9,10,11 4001,4002,4003,4004
答案 0 :(得分:1)
您可以使用简单的awk语句解决问题。
awk '$4 == 9' input.pls > output.pls
但是使用python你可以像这样解决它:
write_pls = open("output.pls", "w")
with open("input.pls") as file:
for line in file:
splitted_line = line.split()
if splitted_line[3] == '9':
out_line = '\t'.join(splitted_line)
write_pls.write(out_line + "\n")
write_pls.close()