AttributeError: у объекта 'str' нет атрибута 'readlines'.Где я ошибся в своем коде? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь с помощью сценария python сгенерировать обратное дополнение для последовательностей ДНК нескольких типов файлов. Вот что я написал до сих пор

import gzip
import re

############## Reverse Complement Function #################################
def rev_comp(dna):
    dna_upper = dna.upper() #Ensures all input is capitalized
    dna_rev = dna_upper[::-1] #Reverses the string

    conversion = {'A':'T','C':'G','G':'C','T':'A','Y':'R','R':'Y',\
       'S':'S','W':'W','K':'M','M':'K','B':'V','V':'B',\
       'D':'H','H':'D','N':'N','-':'-'}

    rev_comp = ''
    rc = open("Rev_Comp.fasta", 'w')
    for i in dna_rev:
        rev_comp += conversion[i]
        rc.write(str(rev_comp))
    print("Reverse complement file Rev_Comp.fasta written to directory")    

x = input("Enter filename (with extension) of the DNA sequence: ")

if x.endswith(".gz"):    #Condition for gzip files
    with gzip.open(x, 'rb') as f:
        file_content = f.read()
        new_file = open("unzipped.fasta", 'w')
        new_file.write(str(file_content))
        print("unzipped.fasta written to directory")

xread = x.readlines()
fast = ''

if x.endswith(".fasta"):   #condition for fasta files
    for i in xread:
        if not i.startswith('>'):
            fast = fast + i.strip('\n')

if x.endswith(".fastq"):        #condition for fastq files
    for i in range(1,len(xread),4):
        fast = fast + xread[i].strip('\n')

rev_comp(x)

И что я получаю, это

AttributeError: 'str' object has no attribute 'readlines'

когда я пытаюсь запустить скрипт, используя файл .fastq. Что именно здесь происходит не так? Я ожидаю, что скрипт напишет Rev_comp.fasta, но это не так.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

x это не дескриптор файла, а просто имя файла.Вам нужно сделать

with open(x) as xhandle:
    xread = xhandle.readlines()

Общая логика может быть лучше, если вы не прочитаете все строки в память.Кроме того, дело .gz заканчивается на неопределенно неопределенной территории;Вам нужно установить x для имени распакованных данных в конце обработки gz или, возможно, поместить код после них в ветку else:?

0 голосов
/ 22 января 2019

x - это ввод от пользователя, который является строкой.Вам нужно open файл, чтобы иметь возможность вызвать readlines для него.

В соответствии с существующим кодом:

x = input("Enter filename (with extension) of the DNA sequence: ") # x stores a string

file_x = open(x, 'r')  # You must open a file ...

xread = file_x.readlines()  # and call readlines on the file instance.

# Although it is not explicitly necessary, remember to close the file when you'done, is good practice.
file_x.close()

или используйте файл в качестве диспетчера контекста

with open(x) as file_x:
    xread = file_x.readlines()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...