Итак, я сгенерировал несколько фиктивных данных:
f1.fasta
>ctg_1_length=147
TCGTGGTCACCGATCGAAGATCCAATATCCGGAGATCGTCTACCTGTATGTAGTAAGCGCAAGGCCCGTTTACTGCGTCACCCTAGCAGAACGCCGACCAGGTCTCCTATAGTCACCGGCCTCGCACCTTTAAGTATGTATAGACGG
>ctg_2_length=141
GCTTGGGTGGGAACGGCTCGTGGCGGAGTACCCGAGAGTGGTTTCGGTATCTGGTGTCGTGCCAGGTTTAATTGAAAATTCAAGATTTTAAGTATCGCTTCAGATAGATTACTTACTGCGAGTGCCTTGTCACAGGGCGGG
>ctg_3_length=124
CCTTCGACCATGGATATCCTAACTCAGCCCCAGCCAGCTAACTCTGGACCAACCGAGAGCGTCTTTCTTTGATGTAACTAAGCTGGCGTTGGGCCCCCCGGTGTTCTAACGTATCTGAAGCCAA
>ctg_4_length=124
CGCGAACTTATCTTGTTATCGAAGATAGCTGTAGGAACTCGGCCAGCCCGACTATTTCGTTCGCCGCTTTCCCCTGGCTCTAGATGCAGTCCACAGATTCTTCTCAGGTGATGCGAGGAACAGG
>ctg_5_length=137
CCAACCCCTGCTCTAGGCTTACCGCCAAGCTACTCAATGGTTCGGTCGATGCAGAACGTATTACTATGTTCTCGACTCTCTGAAACCGCTGTCTACGAGGCAAGCCCCAAAATAGATGGAGGGGCCTCGCCTGTGGG
f2.fasta
>ctg_1_length=106
TCGATATTGGTTAAGGCGCGCAGCAATTTGGGAGTTGACGCACAACGTTCGGATGCGAGAGTGAGCATACGGTAGAGCCGAACCCACAATGGGTAACCGAACGACA
>ctg_2_length=60
CTACGATCTGAAATCCACTTCACGTGATCCGCGAGATGGGTTATTCGGTTTTTAGAACAT
>ctg_3_length=145
ACACTTATATCCACGATTGAGTGGCTCATCGGTGTGACACTCTGACGTCGTTTGAATACCTGCCCGGACAGGGTTTTCGTCAAACTCCCCGCGACGGTTCGTAACTGTCTGTACCCGTCGGCTGGACGAAGTTTAGATATAAAAC
>ctg_4_length=88
GAGCCGCTACATTACTTAATAACTTACAAAGGGCGAAGTCACATATTTCGTAAGAAGCATTCCTCGTCAGAATCCATTCCAAACCCCA
>ctg_5_length=87
CTACGCTAAGCTGCGGTACGACGGGGATATTACACGTACTAATCCATACCAACTAAATGGCATGTTGTTGAAGATAGCACTTTGAGG
Следующий код является "чистым" питономподход, он не требует никаких других модулей (кроме панд, для DataFrame):
import pandas as pd
from pathlib import Path
files = [x for x in Path().iterdir() if x.suffix == ".fasta"]
# [PosixPath('f1.fasta'), PosixPath('f2.fasta')]
read_list = []
for file in files:
with file.open("r") as handle:
for line in handle:
if line.startswith(">"):
line = line.strip()
read_list.append((file.name, # Change to file.resolve() for the absolute path
*line[1:].split("=")
))
df = pd.DataFrame(read_list, columns=["file", "ctg", "len"])
# file ctg len
# 0 f1.fasta ctg_1_length 147
# 1 f1.fasta ctg_2_length 141
# 2 f1.fasta ctg_3_length 124
# 3 f1.fasta ctg_4_length 124
# 4 f1.fasta ctg_5_length 137
# 5 f2.fasta ctg_1_length 106
# 6 f2.fasta ctg_2_length 60
# 7 f2.fasta ctg_3_length 145
# 8 f2.fasta ctg_4_length 88
# 9 f2.fasta ctg_5_length 87
В качестве альтернативы, вы можете использовать SeqIO
из biopython
:
import pandas as pd
from pathlib import Path
from Bio import SeqIO
files = [x for x in Path().iterdir() if x.suffix == ".fasta"]
read_list = []
for file in files:
with file.open("r") as handle:
for record in SeqIO.parse(handle, "fasta"):
read_list.append((file.name, record.id, len(record.seq)))
df = pd.DataFrame(read_list, columns=["file", "ctg", "len"])
# file ctg len
# 0 f1.fasta ctg_1_length=147 147
# 1 f1.fasta ctg_2_length=141 141
# 2 f1.fasta ctg_3_length=124 124
# 3 f1.fasta ctg_4_length=124 124
# 4 f1.fasta ctg_5_length=137 137
# 5 f2.fasta ctg_1_length=106 106
# 6 f2.fasta ctg_2_length=60 60
# 7 f2.fasta ctg_3_length=145 145
# 8 f2.fasta ctg_4_length=88 88
# 9 f2.fasta ctg_5_length=87 87
Оба они работают по одному и тому же принципу построения list
(read_list
) tuples
.Поскольку каждый кортеж действует как запись, pandas
может очень легко превратить их в DataFrame.