what happens if the original sequences has descriptions?
I have the following FASTA file, original.fasta:
>foo
GCTCACACATAGTTGATGCAGATGTTGAATTCACTATGAGGTGGGAGGATGTAGGGCCA
I need to change the record id from foo to bar, so I wrote the following code:
from Bio import SeqIO
original_file = r"path\to\original.fasta"
corrected_file = r"path\to\corrected.fasta"
with open(original_file) as original, open(corrected_file, 'w') as corrected:
records = SeqIO.parse(original_file, 'fasta')
for record in records:
print record.id # prints 'foo'
if record.id == 'foo':
record.id = 'bar'
print record.id # prints 'bar' as expected
SeqIO.write(record, corrected, 'fasta')
We printed the record id before and after the change, and get the expected result. We can even doublecheck by reading in the corrected file again with BioPython and printing out the record id:
with open(corrected_file) as corrected:
for record in SeqIO.parse(corrected, 'fasta'):
print record.id # prints 'bar', as expected
However, if we open the corrected file in a text editor, we see that the record id is not bar but bar foo:
>bar foo
GCTCACACATAGTTGATGCAGATGTTGAATTCACTATGAGGTGGGAGGATGTAGGGCCA</pre>
We can confirm that this is what is written to the file if we read the file using plain Python:
with open(corrected_file) as corrected:
print corrected.readlines()[0][1:] # prints 'bar foo'
Is this a bug in BioPython? And if not, what did I do wrong and how do I change the record id in a FASTA file using BioPython?
2 answers
You have to change the record.description to achieve your goal:
from Bio import SeqIO
original_file = "./original.fasta"
corrected_file = "./corrected.fasta"
with open(original_file) as original, open(corrected_file, 'w') as corrected:
records = SeqIO.parse(original_file, 'fasta')
for record in records:
print record.id
if record.id == 'foo':
record.id = 'bar'
record.description = 'bar' # <- Add this line
print record.id
SeqIO.write(record, corrected, 'fasta')
The description (in a FASTA file) is the line distinguished from the sequence data by a greater-than (">") symbol in the first column. In the problem case, 'foo' is the description and that is the word we want to change so you need to use the record.description change to convert it to 'bar'.
I am having a similar problem - only when i modify both ID and description in the same way (as suggested in the answer) do i get a name change as required. So the code below works:
for record in records:
record.id = "NEW_TEXT" + record.id
record.description = "NEW_TEXT" + record.description
My ID is the accession number from ENA database and the description is initially identical other than some text description of the sequence origin. However, if i do:
for record in records:
record.id = "NEW_TEXT" + record.id
record.description = "NEW_TEXT" + record.description.replace(" ", "_")
My output file duplicates the accession (presumably its using both the ID and description as the new FASTA heading. Adding the .replace(" ", "_") to the altered ID does not solve the problem.
Possibly needs a new question and propper description?
I think I had a similar problem where I wanted to change the fasta header due to a whitespace. i.e., "Barcode a" to "Barcode_a" and got an additional line in the header.
Overcame this by doing
for record in records:
record.description = record.description.replace(" a", "_a")
record.id=record.description
I want to change the names of 40k fasta files using a dictionary record containing the names to be changed how to do in bippython
See the suggestions of shenwei356, and if that doesn't help it's probably more appropriate to open a separate thread. But please be more informative, your one-line question doesn't tell us all we need to help.
Log in to answer this question.