Использование команды sed transiterate в python
Таким образом, есть эта команда sed, которая позволяет вам преобразовать код качества в ASCII в штриховые символы:
sed -e 'n;n;n;y/!"#$%&'\''()*+,-.\/0123456789:;<=>?@ABCDEFGHIJKL/▁▁▁▁▁▁▁▁▂▂▂▂▂▃▃▃▃▃▄▄▄▄▄▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇██████/' myfile.fastq
Я проверял способы сделать то же самое в Python, но я не нашел решения, которое я мог бы использовать. Может быть, pysed или re.sub, но я даже не знаю, как написать ASCII-код в строку без путаницы символов на языке python.
1 ответ
Итак, вы хотите транслитерировать символы в 3-й строке вашего файла FASTQ?
Ты можешь использовать str.translate
на столе перевода, построенного с str.maketrans
:
#!/usr/bin/env python3
lut = str.maketrans('''!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKL''',
'''▁▁▁▁▁▁▁▁▂▂▂▂▂▃▃▃▃▃▄▄▄▄▄▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇██████''')
with open('/path/to/fastq') as f:
line3 = f.readlines()[3].strip()
print(line3.translate(lut))
Для примера файла из Википедии:
@SEQ_ID
GATTTGGGGTTCAAAGCAGTATCGATCAAATAGTAAATCCATTTGTTCAACTCACAGTTT
+
!''*((((***+))%%%++)(%%%%).1***-+*''))**55CCF>>>>>>CCCCCCC65
вышеприведенный скрипт Python выдаст:
▁▁▁▂▁▁▁▁▂▂▂▂▂▂▁▁▁▂▂▂▁▁▁▁▁▂▃▃▂▂▂▂▂▂▁▁▂▂▂▂▄▄▇▇▇▆▆▆▆▆▆▇▇▇▇▇▇▇▄▄
Однако обратите внимание, что в соответствии с описанием формата FASTQ в Википедии, ваша таблица перевода неверна. Характер !
представляет собой наименьшее качество в то время как ~
самый высокий (не L
как у тебя).
Также обратите внимание, что качественные символы напрямую отображают диапазон символов ASCII !
- ~
в качестве качества. Другими словами, мы можем построить таблицу перевода программно:
span = ord('█') - ord('▁') + 1
src = ''.join(chr(c) for c in range(ord('!'), ord('~')+1))
dst = ''.join(chr(ord('▁') + span*(ord(c)-ord('!'))//len(src)) for c in src)
lut = str.maketrans(src, dst)