Использование команды 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)
Другие вопросы по тегам