Больше pythonic для преобразования байтов в строку при обработке ответа urllib вместо chr (int (x)) - PullRequest
1 голос
/ 06 октября 2019

Я поздно конвертирую в Python 3. Я пытаюсь обработать вывод из API REST для последовательностей белков, используя urllib.

В устаревшем питоне я мог бы использовать:

self.seq_fileobj = urllib2.urlopen("http://www.uniprot.org/uniprot/{}.fasta".format(uniprot_id))
self.seq_header = self.seq_fileobj.next()
print "Read in sequence information for {}.".format(self.seq_header[:-1])
self.sequence = [achar for a_line in self.seq_fileobj for achar in a_line if achar != "\n"]
print("Sequence:{}\n".format("".join(self.sequence)))

Длятот же фрагмент кода в Python 3, который я использую:

context = ssl._create_unverified_context()
self.seq_fileobj = urllib.request.urlopen("https://www.uniprot.org/uniprot/{}.fasta".format(uniprot_id),context=context)
self.seq_header = next(self.seq_fileobj)
print("Read in sequence information for {}.".format(self.seq_header.rstrip()))
self.b_sequence = [str(achar).encode('utf-8') for a_line in self.seq_fileobj for achar in a_line]
self.sequence = [chr(int(x)) for x in self.b_sequence]

Я немного прочитал о кодировании и декодировании строк, чтобы изменить свое понимание списка для Python 3:

self.b_sequence = [str(achar).encode('utf-8') for a_line in self.seq_fileobj for achar in a_line]
self.sequence = [chr(int(x)) for x in self.b_sequence]

Хотямой код работает - это лучший способ достичь этого результата, когда я иду от массива байтов символов ascii, закодированных с помощью utf-8, к их результирующим строкам ?. Бит chr (int (x)) - это то, что мне кажется непитонным, и я боюсь, что я что-то упускаю.

1 Ответ

1 голос
/ 06 октября 2019

Вам не нужно преобразовывать байты в строки на символьной основе. Поскольку вы хотите удалить символы новой строки, вы можете вместо этого прочитать весь файл как байты, преобразовать байты в строки с помощью метода decode (по умолчанию используется кодировка utf-8, как вы используете) и удалить символы новой строкииспользуя метод str.replace:

self.sequence = list(self.seq_fileobj.read().decode().replace('\n', ''))
...