I'd like feedback on my function to convert FASTA data to a dictionary in Python. Here's an example of FASTA text:
>gi|33112219|sp|O93279.1|A4_TAKRU RecName: Full=Amyloid beta A4 protein; AltName: Full=ABPP; Short=APP; AltName: Full=Alzheimer disease amyloid A4 protein homolog; Contains: RecName: Full=Beta-amyloid protein; AltName: Full=A-beta; AltName: Full=Beta-APP; Flags: Precursor
MGETTAFVLLLVATLTRSSEIPADDTVGLLTEPQVAMFCGKLNMHINVQNGKWESDPSGTKSCLNTKEGI
LQYCQEVYPELQITNVVEANQPVSIQNWCKKGRKQCRSHTHIVVPYRCLVGEFVSDALLVPDKCKFLHQE
RMNQCESHLHWHTVAKESCGDRSMNLHDYGMLLPCGIDRFRGVKFVCCPAETEQETDSSEVEGEESDVWW
GGADPEYSENSPPTPSRATYVAGDAFERDENGDGDEDEEDDEDVDPTDEQESDERTANVAMTTTTTTTTE
SVEEVVRAVCWAQAESGPCRAMLERWYFNPKKRRCVPFLFGGCGGNRNNFESEEYCLAVCSSSLPTVAPS
PPDAVDQYFEAPGDDNEHADFRKAKESLEAKHRERMSQVMREWEEAERQAKNLPRADKKAVIQHFQEKVE
ALEQEAAGERQQLVETHMARVEALLNSRRRLTLENYLGALQANPPRARQVLSLLKKYVRAEQKDRQHTLK
HYEHVRTVDPKKAAQIRPQVLTHLRVIDERMNQSLALLYKVPSVASEIQNQIYPAAGSDCKDPVEHCVCP
QVDGLVSYGNDALMPDQAYSSAPMDMGVDGLGSIDQSFNQANTENHVEPVDARPIPDRGLPTRPVSSLKL
EEMPEVRTETDKRQSAGYEVYHQKLVFFADDVGSNKGAIIGLMVGGVVIATVIVITLVMLRKKQYTSIHH
GVIEVDAAVTPEERHLARMQQNGYENPTYKFFEQMQN
- FASTA lines to be used as a key begin with '>'
- FASTA lines to be used as a value follow the key line.
- Repeat
Is this the best way to remove whitespace, tabs, newlines, etc? I suspect it isn't because I can't tell which escape characters my .txt has.
def txt2dict(filename, key_id, \
replace_id_list = ['\r','\n','\w','\s','\t','\v','\f'], min_len = 1):
"""A .txt file is opened as lines. Every line containing 'key_id' is added
to the dictionary as a key. Every line which doesn't contain 'key_id' is
added to the dictionary as a value for the previous key."""
dictionary = dict()
open_file = open(filename, 'r')
lines = open_file.readlines()
open_file.close()
for line in lines:
if key_id in line:
key_line = line
value_line = str()
if key_id not in line:
value_line = value_line + line
dictionary.update({key_line:value_line})
copy = dictionary.copy()
for key, value in dictionary.items():
if len(value) <= min_len:
del copy[key]
else:
for replace_id in replace_id_list:
value = value.replace(replace_id, '')
copy.update({key:value})
return copy
Here's an example returned dictionary. I have truncated the keys and values.
{'>gi|33112219|sp|O93279.1|A4': 'MGETTAFVLLLVATLTRSSEIPADDTVG', '>gi|another protein': 'ANDITSSEQUENCE'}
The above dictionary could have come from the text:
>gi|33112219|sp|O93279.1|A4\n
MGETTAFVLLLVATLTRSSEIPADDTVG\n
>gi|another protein\n
ANDITS\n
SEQUENCE\n