2014-10-05 1 views
0

Я довольно новичок в python, и мне нужна ваша помощь.Печать в той же строке в python

У меня есть файл, как это:

>chr14_Gap_2 
ACCGCGATGAAAGAGTCGGTGGTGGGCTCGTTCCGACGCGCATCCCCTGGAAGTCCTGCTCAATCAGGTGCCGGATGAAGGTGGT 
GCTCCTCCAGGGGGCAGCAGCTTCTGCGCGTACAGCTGCCACAGCCCCTAGGACACCGTCTGGAAGAGCTCCGGCTCCTTCTTG 
acacccaggactgatctcctttaggatggactggctggatcttcttgcagtccaaggggctctcaagagt 
……….. 
>chr14_Gap_3 
ACCGCGATGAAAGAGTCGGTGGTGGGCTCGTTCCGACGCGCATCCCCTGGAAGTCCTGCTCAATCAGGTGCCGGATGAAGGTGGT 
GCTCCTCCAGGGGGCAGCAGCTTCTGCGCGTACAGCTGCCACAGCCCCTAGGACACCGTCTGGAAGAGCTCCGGCTCCTTCTTG 
acacccaggactgatctcctttaggatggactggctggatcttcttgcagtccaaggggctctcaagagt 
……….. 

Одна строка в качестве тега и одной строки последовательность днк. Я хочу рассчитать число N букв и число букв в нижнем регистре и принять процент. Я написал следующий скрипт, который работает, но у меня проблема при печати.

#!/usr/bin/python 

import sys 


if len (sys.argv) != 2 : 
    print "Usage: If you want to run this python script you have to put the fasta file that  includes the desert area's sequences as arument" 
    sys.exit (1) 

    fasta_file = sys.argv[1] 

#This script reads the sequences of the desert areas (fasta files) and calculates the persentage of the Ns and the repeats. 

fasta_file = sys.argv[1] 
f = open(fasta_file, 'r') 

content = f.readlines() 
x = len(content) 
#print x 
for i in range(0,len(content)): 
     if (i%2 == 0): 
      content[i].strip() 
      name = content[i].split(">")[1] 
      print name, #the "," makes the print command to avoid to print a new line 
    else: 
      content[i].strip() 
      numberOfN = content[i].count('N') 
      #print numberOfN 
      allChar = len(content[i]) 
      lowerChars = sum(1 for c in content[i] if c.islower()) 
      Ns_persentage = 100 * (numberOfN/float(allChar)) 
      lower_persentage = 100 * (lowerChars/float(allChar)) 
      waste = Ns_persentage + lower_persentage 
      print ("The waste persentage is: %s" % (round(waste))) 
      #print ("The persentage of Ns is: %s and the persentage of repeats is: %s" % (Ns_persentage,lower_persentage)) 

    #print (name + waste) 

Дело в том, что он может напечатать метку в первой строке и переменную отходов во втором, как это:

chr10_Gap_18759 
The waste persentage is: 52.0 

Как я могу напечатать его в той же строке, вкладки разделены ?

например

chr10_Gap_18759  52.0 
chr10_Gap_19000  78.0 
……. 

Большое спасибо.

+0

Пожалуйста, укажите пример ввода и что вы хотите увидеть в результате для этого точного ввода. –

ответ

0

Не печатать name когда (i%2 == 0), просто сохранить его в переменной и печати в следующей итерации вместе с процентом:

print("{0}\t{1}".format(name, round(waste))) 

This method of string formatting (new in version 2.6) is the new standard in Python 3, and should be preferred to the % formatting described in String Formatting Operations in new code.

+0

К сожалению, функция str.format() не работает. AttributeError: объект 'str' не имеет атрибута 'format' – Vasilis

+0

Какую версию Python вы используете? 2,2? Ну, если это так, вам нужно вместо этого использовать% оператора. – Sventimir

1

Вы можете распечатать его с:

print name, "\t", round(waste) 

Если вы используете python 2.X Я бы ввел некоторые изменения в ваш код. Для управления аргументами из командной строки существует модуль argparse python. Я хотел бы сделать что-то вроде этого:

#!/usr/bin/python 

import argparse 
# To use the arguments 
parser = argparse.ArgumentParser() 
parser.add_argument("fasta_file", help = "The fasta file to be processed ", type=str) 
args = parser.parse_args() 

f= open(args.fasta_file, "r") 
content = f.readlines() 
f.close() 

x = len(content) 
for i in range(x): 
     line = content[i].strip() 
     if (i%2 == 0): 
      #The first time it will fail, for the next occasions it will be printed as you wish 
      try: 
       print bname, "\t", round(waste) 
      except: 
       pass 
      name = line.split(">")[1] 
    else: 
      numberOfN = line.count('N') 
      allChar = len(line) 
      lowerChars = sum(1 for c in content[i] if c.islower()) 
      Ns_persentage = 100 * (numberOfN/float(allChar)) 
      lower_persentage = 100 * (lowerChars/float(allChar)) 
      waste = Ns_persentage + lower_persentage 
# To print the last case you need to do it outside the loop 
print name, "\t", round(waste) 

Вы также можете распечатать его как другой ответ с print("{}\t{}".format(name, round(waste)))

Я не уверен, об использовании i%2, обратите внимание, что если последовательность использует и нечетное число строк вы не получите имя следующей последовательности до тех пор, пока не произойдет одно и то же событие. Я бы проверял, начинается ли строка с «>», затем используйте имя хранилища и суммируйте символы следующей строки.

+0

Благодарим вас за предложения. Я пробовал это, но это дает мне синтаксическую ошибку в следующей строке: с открытым (args.fasta_file, «r») как f: Когда я использую оператор печати, он печатает все в строке, но вот так: (' chr15_Gap_1513 \ n ',' \ t ', 75.0) – Vasilis

+0

Теперь это должно быть правильно, я изменил функцию печати, потому что кажется, что вы используете python 2.x. Я также модифицировал выражение .format, если оно работает – Llopis

0

Я установил отступы и избыточность:

#!/usr/bin/python 
""" 
This script reads the sequences of the desert areas (fasta files) and calculates the percentage of the Ns and the repeats. 
2014-10-05 v1.0 by Vasilis 
2014-10-05 v1.1 by Llopis 
2015-02-27 v1.2 by Cees Timmerman 
""" 

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument("fasta_file", help="The fasta file to be processed.", type=str) 
args = parser.parse_args() 

with open(args.fasta_file, "r") as f: 
    for line in f.readlines(): 
     line = line.strip() 
     if line[0] == '>': 
      name = line.split(">")[1] 
      print name, 
     else: 
      numberOfN = line.count('N') 
      allChar = len(line) 
      lowerChars = sum(1 for c in line if c.islower()) 
      Ns_percentage = 100 * (numberOfN/float(allChar)) 
      lower_percentage = 100 * (lowerChars/float(allChar)) 
      waste = Ns_percentage + lower_percentage 

      print "\t", round(waste) # Note: https://docs.python.org/2/library/functions.html#round 

Fed:

>chr14_Gap_2 
ACCGCGATGAAAGAGTCGGTGGTGGGCTCGTTCCGACGCGCATCCCCTGGAAGTCCTGCTCAATCAGGTGCCGGATGAAGGTGGTGCTCCTCCAGGGGGCAGCAGCTTCTGCGCGTACAGCTGCCACAGCCCCTAGGACACCGTCTGGAAGAGCTCCGGCTCCTTCTTGacacccaggactgatctcctttaggatggactggctggatcttcttgcagtccaaggggctctcaagagt 
>chr14_Gap_3 
ACCGCGATGAAAGAGTCGGTGGTGGGCTCGTTCCGACGCGCATCCCCTGGAAGTCCTGCTCAATCAGGTGCCGGATGAAGGTGGTGCTCCTCCAGGGGGCAGCAGCTTCTGCGCGTACAGCTGCCACAGCCCCTAGGACACCGTCTGGAAGAGCTCCGGCTCCTTCTTGacacccaggactgatctcctttaggatggactggctggatcttcttgcagtccaaggggctctcaagagt 

Выдает:

C:\Python27\python.exe -u "dna.py" fasta.txt 
Process started >>> 
chr14_Gap_2  29.0 
chr14_Gap_3  29.0 
<<< Process finished. (Exit code 0) 

Использование моей любимой IDE Python: Notepad++ с NppExec plugin.