如何使用Biopython将CSV文件中的snp/INDEL添加到FASTA文件?
我想修改FASTA文件的序列。我的FASTA包含人类基因组(每个染色体的序列),ID为如何使用Biopython将CSV文件中的snp/INDEL添加到FASTA文件?,python,csv,biopython,fasta,mutation,Python,Csv,Biopython,Fasta,Mutation,我想修改FASTA文件的序列。我的FASTA包含人类基因组(每个染色体的序列),ID为>1,>2>22、>X、>Y、>MT和>GL000207.1 我想在每个染色体序列中引入的修改(突变)位于CSV文件中。此处显示了一个示例: chrom;position;ref;var;Gene;VAR 1;21424;C;T;WASH7P;snp.LOH 1;33252099;CACATGCATGACTATTCCTAGCC;-;YARS;indel_somatic 5;107061668;-;GT;EFNA
>1
,>2
<代码>>22、>X
、>Y
、>MT
和>GL000207.1
我想在每个染色体序列中引入的修改(突变)位于CSV文件中。此处显示了一个示例:
chrom;position;ref;var;Gene;VAR
1;21424;C;T;WASH7P;snp.LOH
1;33252099;CACATGCATGACTATTCCTAGCC;-;YARS;indel_somatic
5;107061668;-;GT;EFNA5(dist=55072),FBXL17(dist=133066);indel_somatic
22;22677038;G;C;BMS1P20;snp_somatic
MT;16093;T;C;NONE(dist=NONE),NONE(dist=NONE);snp.LOH
X;22012649;-;T;SMS;indel_somatic
其中每一行描述了染色体数目,即染色体上发现snp/indel的位置。接下来的两列表示参考核苷酸和必须插入FASTA文件中的突变。这种修饰可以是替换、删除(一个以上的nt)或插入(一个以上的核苷酸)。最后两列并不重要。输出应该是带有突变的新FASTA
我创建了以下脚本。我知道我离我想做的还很远。。。我会努力提高,但同时如果有人能给我一些建议,那将是非常受欢迎的
from bisect import bisect_right
from collections import defaultdict
from Bio import SeqIO
from Bio.Seq import MutableSeq
from Bio.Alphabet import IUPAC
import csv
def line_to_snp(line):
row = line.split(";")
return row[0], int(row[1]), row[2], row[3], row[4], row[5]
with open('Modified_build.fasta', 'w') as f1:
reference = SeqIO.read("human_g1k_v37.fasta", "fasta")
datafile = open('snp_all.csv', 'r')
snp = line_to_snp(line)
for seq_record in SeqIO.parse(reference):
mutable_seq = MutableSeq (reference, IUPACUnambigousDNA())
if snp[0] == seq_record.id:
mutable_seq[snp[1]] = snp[3]
f1.write(seq_id)
f1.write(seq_record)
您当前的方法是一个良好的开端,但是您的代码在打开CSV文件时没有做任何事情(
datafile
未被触及,并且line
未定义)
我会从你的SNP文件中建立一个数据字典。您可以使用该模块读取代码>-分隔文件。当迭代SeqRecord
对象时,您可以从该字典中获取突变数据
杂项错误:
MutableSeq
无法修改记录,只能修改字符串或Seq
- Python字符串(因此
Seq
对象)使用基于零的索引,而序列索引是基于一的
- 未定义名称
IUPACUnambiguouUSDNA
(这是IUPAC
的一部分)
我的建议是采用如下方法:
from Bio import SeqIO
from Bio.Alphabet import IUPAC
from Bio.Seq import MutableSeq
from Bio.SeqRecord import SeqRecord
import csv
# Build a dictionary of position & mutation by accession
snp_dict = {}
with open('snp_all.csv') as snp_all:
csv_data = csv.reader(snp_all, delimiter=';')
header = next(csv_data)
for chrom, position, ref, var, _, _ in csv_data:
snp_dict[chrom] = (int(position), ref, var)
# Iterate over (missing) FASTA file, create mutations
mutated_records = []
reference = SeqIO.read("human_g1k_v37.fasta", "fasta")
for record in SeqIO.parse("this_file_missing.fasta", "fasta"):
mutable_seq = MutableSeq(reference.seq, IUPAC.IUPACUnambigousDNA())
if record.id in snp_dict: # Are all sequences mutated in snp_all?
position, ref, var = snp_dict[record.id]
mutable_seq[position - 1] = var
record.seq = mutable_seq.toseq() # Re-use the record- preserves id, etc.
mutated_records.append(record)
with open('Modified_build.fasta', 'w') as f1:
SeqIO.write(mutated_records, f1, "fasta")
你有没有试图解决这个问题?你有代码要显示吗?这应该是你熟悉读/写FASTA记录的一个很好的起点。是的,我已经添加了我到目前为止所做的工作……好的,太好了!现在,你有什么特别的问题吗?我不知道如何特别地将fasta文件中的核苷酸更改为csv文件中特别标识的核苷酸。如果我们看一下上面的例子,我想更改fasta文件的染色体1中T的核苷酸21424