Как передать новые строки в текстовом файле в коде Python, чтобы применить функцию к различным строкам? - PullRequest
0 голосов
/ 18 июня 2019

У меня есть код Python, который переводит аминокислотные последовательности в последовательности ДНК:

# Read the file and get the Peptide string
file = open('../Results/sample_dna2.txt', 'r')
dna = file.read()
#print(dna)

# Protein codon table
protein = {
  'A': ('GCC'),
  'B': ('GAC'),
  'C': ('TGC'),
  'D': ('GAC'),
  'E': ('GAG'),
  'F': ('TTC'),
  'G': ('GGC'),
  'H': ('CAC'),
  'I': ('ATC'),
  'K': ('AAG'),
  'L': ('CTG'),
  'M': ('ATG'),
  'N': ('AAC'),
  'P': ('CCC'),
  'Q': ('CAG'),
  'R': ('AGG'),
  'S': ('AGC'),
  'T': ('ACC'),
  'V': ('GTG'),
  'W': ('TGG',),
  'Y': ('TAC'),
  '*': ('TGA'),
}

dna_sequence = ""

# Generate DNA sequence
for i in range(0, len(dna)-(0+len(dna)%1), 1):
    dna_sequence += protein[dna[i:i+1]]

# Print the DNA sequence
print (dna_sequence)

Код работает, когда текстовый файл имеет следующий формат:

ABBBC

Но кодне работает, когда текстовый файл выглядит так:

ABBBC

ABBBC

Я получаю следующую ошибку от Python:

KeyError Traceback (most recent call last) <ipython-input-35-8a6fd8cd8220>     in <module>

35 # Generate DNA sequence 
36 for i in range(0, len(dna)-(0+len(dna)%1), 1): --->
37 dna_sequence += protein[dna[i:i+1]] 
38 
39 # Print the DNA sequence KeyError: '\n'

Как я могу исправить код, чтобы он проходил новую строкуи перевести следующую пептидную последовательность?Обратите внимание, что я новичок в Python, поэтому любая помощь будет принята с благодарностью.

Я бы хотел, чтобы результат был таким, пожалуйста:

CTGATC

CTGATC

Ответы [ 3 ]

0 голосов
/ 18 июня 2019

Читайте в своем файле построчно, а не все одновременно, например,

file = open('../Results/sample_dna2.txt', 'r')
file_lines = file.readlines()
dna = []
for f in file_lines:
    dna.append(f)

Теперь у вас есть список dna, который вы можете перебирать ..

dna_sequence = ""
# Generate DNA sequence
for sequence in dna:
    for i in range(0, len(sequence)-(0+len(sequence)%1), 1):
        dna_sequence += protein[sequence[i:i+1]]

print (dna_sequnce)
0 голосов
/ 19 июня 2019

range в вашем скрипте очень странно. Значение 0+len(sequence)%1 будет просто равно len(sequence) для каждого возможного значения; и в любом случае, вы просто имеете в виду range(len(sequence)).

Вот альтернативное решение, которое не использует исключения, а вместо этого избавляется от любых пробелов, включая переводы строки. Слепое игнорирование любых KeyError просто отбрасывало бы любые неизвестные последовательности во вводе, а не только переводы строк - вы определенно хотите получить предупреждение, если ваш ввод не соответствует вашим ожиданиям.

Он также обрабатывает одну строку за раз, так что вам не нужно читать весь ввод в память. Для небольших входов это, вероятно, не имеет значения, но для больших входов вы определенно хотите избегать хранения всего в памяти.

import sys

with open(sys.argv[1], 'r') as input:
    for line in input:
        dna = line.rstrip()
        sequence = []
        for i in range(len(dna)):
            sequence.append(protein[dna[i:i+1]])
        print(''.join(sequence))

Это также позволяет вам передавать имя входного файла в качестве параметра командной строки - вы получите его в sys.argv[1], что, конечно, требует import sys в начале скрипта.

0 голосов
/ 18 июня 2019

Попробуйте что-то вроде этого

# Generate DNA sequence

for i in range(0, len(dna)-(0+len(dna)%1), 1):
    try:
        dna_sequence += protein[dna[i:i+1]]
    except KeyError:
        dna_sequence += dna[i:i+1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...