2015-10-04 3 views
1

Если у меня есть текстовый файл, и он содержит что-то вроде этого:Python- Чтение всего TXT-файл в 1 строку

AGCGTTGATAGTGCAGCCATTGCAAAACTTCACCCTA 
AGCGTTGATAGTGCAGCCATTGCAAAACTTCACCCTA 
AAGAAACGAGTATCAGTAGGATGCAGACGGTTGATTG 

Но есть «\ п» между строками.
И теперь, если я хочу сделать из них триплеты. Тогда есть способ, чтобы прочитать весь текстовый файл в виде строки, чтобы он не дал бы мне:

'CAA', 'TGC', '\nAG', 'CGT', 'TGA', 'TAG', 'TGC', 'AGC', 

Я загрузил весь свой код, у меня есть на данный момент, потому что ни один из приведенных ответов не казалось, чтобы помочь.
Вот код, я использую, чтобы разделить всю строку в троек:

fob = open("Exercise.txt", "r") 
def read_from_file(filename): 
    raw_txt = filename.read() 
    triplets = [raw_txt[i:i+3] for i in range(0, len(raw_txt), 3)] 
read_from_file(fob) 
+0

Что такое символ для каждой строки? – Basilevs

+0

Возможный дубликат [Прокладки пробелов/вкладки/новые строки - python] (http://stackoverflow.com/questions/10711116/strip-spaces-tabs-newlines-python) – Basilevs

+0

Я не совсем уверен, что вы просите – Donka

ответ

2
raw_txt = ''.join(line.rstrip('\n') for line in f.readlines()) 

Или, как @PM 2Ring предложил:

raw_txt = ''.join(f.read().splitlines()) 
+0

Если вы можете _guarantee_, что файл заканчивается в новой строке, вы можете просто выполнить '.' .join ([line [: - 1] для строки в f .readlines()]) '. OTOH, я предпочитаю использовать '. '.join (f.read(). Splitlines())'. –

2

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

with open('file') as f: 
    text = f.read().replace('\n', '') 
    triplets = [text[i:i+3] for i in range(0, len(text), 3)] 

Вы также можете не читать весь файл в памяти и читайте его итерационно, выбирая триплеты. Можно даже сделать это очень ленивым с помощью функций генератора и композиции функций (это делает его очень функциональным):

def getCharacters (fileName): 
    with open(fileName) as f: 
     for line in f: 
      yield from line.rstrip() 

def getTriplets (source): 
    it = [iter(source)] * 3 
    for triplet in zip(*it): 
     yield ''.join(triplet) 

# and get a list of triplets 
triplets = list(getTriplets(getCharacters('file')) 
+2

И, конечно, если вы хотите декодировать эти триплеты аминокислотам, нет необходимости создавать их список, вы можете сделать что-то вроде 'для триплета в getTriplets (getCharacters ('file')):' 'aa = codon [ triplet] ', где' codon' является 'dict' аминокислот, индексированных триплетной строкой. –

+0

Можете ли вы объяснить «def getTriplets»? Что делает «iter» и zip (*) do – Donka

+0

@Donka Это [определение функции] (https://docs.python.org/3/tutorial/controlflow.html#defining-functions). [iter] (https://docs.python.org/3/library/functions.html#iter) создает итератор из итерабельного и [zip] (https://docs.python.org/3/library/ functions.html # zip) объединяет несколько итераций. Пожалуйста, прочитайте учебник, если вы действительно не знаете, какие функции ... – poke

3

Вам не нужно звонить readlines, просто перебирать файл obejct rstripping каждую строку:

with open("test.txt") as f: 
    line = "".join([line.rstrip() for line in f]) 

Или сочетать его с map:

with open("test.txt") as f: 
    line = "".join(list(map(str.rstrip,f))) 

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

Если вы хотите ломтики просто позвонить iter на соединенном строку и пронестись:

line = iter("".join(list(map(str.rstrip, f)))) 
for sli in zip(line, line, line): 
    print("".join(sli)) 

Если у вас есть данные, которые не было кратно 3, и вы не хотите потерять ее, вы могли бы использовать itertools .zip_longets:

from itertools import zip_longest 
with open("test.txt") as f: 
    line = iter("".join(list(map(str.rstrip, f)))) 
    for sli in zip_longest(line,line,line, fillvalue=""): 
     print("".join(sli)) 

На ваш вход образца и выход будет:

AGC 
GTT 
GAT 
AGT 
GCA 
GCC 
ATT 
GCA 
AAA 
CTT 
CAC 
CCT 
AAG 
CGT 
TGA 
TAG 
TGC 
AGC 
CAT 
TGC 
AAA 
ACT 
TCA 
CCC 
TAA 
AGA 
AAC 
GAG 
TAT 
CAG 
TAG 
GAT 
GCA 
GAC 
GGT 
TGA 
TTG 
+0

Почему итерация над файловым объектом умнее? – Basilevs

+0

@Basilevs, потому что вы не сохраняете другую копию файла в памяти без каких-либо причин. ".join ([line.rstrip() для строки в f.readline()])' будет в конечном итоге с тремя копиями файл в памяти, список comp, соединение и вызов readlines. –

1

Я не знаю, решил ли я вопрос, , но проверить свой код.

Я только что изменил ваш код.

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

Так для этого я не раздели его, но я заменил «\ п» с «», используя

rtxt = raw_txt.replace('\n', '') 

вот код:

fob = open("Exercise.txt", "r") 
def read_from_file(filename): 
    raw_txt = filename.read() 
    rtxt = raw_txt.replace('\n', '') 
    triplets = [rtxt[i:i+3] for i in range(0, len(rtxt), 3)] 
    print triplets 
read_from_file(fob) 

Выход в список триплетов :

['AGC', 'GTT', 'GAT', 'AGT', 'GCA', 'GCC', 'ATT', 'GCA', 'AAA', 'CTT', 'CAC', 'CCT', 'AAG', 'CGT', 'TGA', 'TAG', 'TGC', 'AGC', 'CAT', 'TGC', 'AAA', 'ACT', 'TCA', 'CCC', 'TAA', 'AGA', 'AAC', 'GAG', 'TAT', 'CAG', 'TAG', 'GAT', 'GCA', 'GAC', 'GGT', 'TGA', 'TTG'] 
Смежные вопросы