2016-04-07 14 views
0

Извините заранее, если это уже было задано, но я потратил часы на поиск ответов на это. Я новый ученик Python (3.5.1, Windows 10), и моя задача - написать функцию, которая читает содержимое файла Fasta (чье имя задано пользователем) и создает новый файл (имя также указано пользователем, может быть .fasta или .txt) с последовательностями Fasta в верхнем регистре. Файл fasta форматируется, поэтому заголовку последовательности предшествует каретка, а последующие строки - это символы (те, которые я хочу заглавными). Файл fasta может содержать несколько строк, включенных в файл, я не хочу задерживать эти строки.Python - функция, которая считывает содержимое файла и создает новый файл с содержимым в верхнем регистре

import sys 
def fasta_upper(fasta_input_file, fasta_output_file): 
    fasta_input_file = sys.argv 
    with open('fasta_input_file', 'r') as f: 
     file_contents = f.read() 
     temp_contents = file_contents[:] 
     for line in temp_contents: 
      if line.startswith('>'): 
       pass 
      else: 
       g = line.upper() 
       open('fasta_output_file', 'w') 
       fasta_output_file.write(g) 
       fasta_input_file.close() 
       fasta_output_file.close() 

Например, это Fasta Файл:

Название последовательности cgtatgggggtattccgtagctctgctgacgcgcttatatttagc cgctcgatctggaggactctgcgatcgcggcatcgagctagcggc

бы записать так:

Название sequen се CGTATGGGGGGTATTCCGTAGCTCTGCTGACGCGCTTATATTTAGC CGCTCGATCTGGAGGACTCTCGATCGCGGCATCGAGCTAGCGCGGC

Я уверен, что это просто пронизана очевидных ошибок, но опять же я буду студент пытается узнать. Пожалуйста, будьте нежны! Заранее спасибо за любые советы или советы вы имеете, я действительно наслаждался Python, и я хотел бы, чтобы преодолеть это разочарование и стать более состоятельной программиста :)

ответ

0

несколько исправлений/улучшений:

1) Если вы открываете файл с помощью инструкции «с», вам не нужно явно закрывать его. С делает это для вас.

fasta_input_file.close(), следовательно, не подбирается.

2) Для каждой строки, которая не начинается с '>', этот код открывает файл fasta_output_file, перезаписывая строку и закрывая ее. Вместо этого вам нужно сделать это.

инициализирует переменную выходной_файл до «с» утверждением (Так что вам не придется открывать и закрывать внутри цикла) outfile = open('fasta_output_file', 'a')

Запись в файл в операторе еще (outfile.write(g) должно быть в заявлении еще).

Закройте выходной файл после выхода оператора «with». outfile.close()

Еще несколько точек:

Вы должны вызвать запись() и Close() методы на объект файла, который создается при открытии файла.

Кроме того, вы передаете имена файлов в качестве аргумента функции, а также пытаетесь прочитать из аргументов командной строки. Вам нужно сделать только один из двух.

0
  1. Вы сразу же переписываете fasta_input_filesys.argv.Неясно, должны ли имена появляться от вызывающего или из аргументов.
  2. sys.argv - это последовательность аргументов. Вероятно, вам нужен второй, sys.argv[1].
  3. Вы вводите в заблуждение строки с именами. 'fasta_input_file' - это не то же самое, что fasta_input_file.
  4. Когда вы читаете файл с read(), он становится строкой. Итерирование строки создает одиночные символы, а не целые строки.
  5. Вместо того, чтобы проверять состояние, а затем делать pass, если это выполнено, проверьте на not это условие, а затем сделайте все, что нужно сделать там.
  6. 'fasta_output_file', опять же, не то же самое, что и fasta_output_file.
  7. Вы открыли выходной файл, но не сохранили ссылку (например, out = open(...) или создали диспетчер контекста (например, with open(...) as out:).
  8. Вы закрываете входные и выходные файлы после одной «линии».

Вот пример того, что ваш код может выглядеть с этими ошибками, принятых на себя:

import sys 

def fasta_upper(): 
    fasta_input_file, fasta_output_file = sys.argv[1], sys.argv[2] 
    with open(fasta_input_file) as f, open(fasta_output_file, 'w') as output: 
     for line in f: 
      if not line.startswith('>'): 
       line = line.upper() 
      output.write(line) 

fasta_upper() 
0
import sys 
import re 

if len(sys.argv) < 3: 
    print('Usage:\n\t{} <input file> <output file>'.format(sys.argv[0])) 
    sys.exit(1) 

pattern = re.compile(r'\b[acgturykmswbdhvnx\-]+\b', re.M) 

def repl(m): 
    return m.group(0).upper() 


with open(sys.argv[1], 'r') as in_fh, open(sys.argv[2], 'w') as out_fh: 
    for line in in_fh: 
     if line.startswith('>'): 
      out_fh.write(line) 
     else:  
      out_fh.write(pattern.sub(repl, line)) 
+0

Что было не так с просто звоню 'верхний()'? –

+0

@JoelCornett хорошо разбирается в примерах. Ouwan12 хочет преобразовать только нуклеотидные последовательности и оставить неизменным все остальное, включая заголовки последовательностей. Или я пропустил более простой способ? –