Wykorzystanie funkcji range to drukowania określonej liczby znaków w każdej linii

0

Mam takie zadanie i nie wiem jak to zrobić:
Chcielibyśmy zmienić liczbę znaków w linii w pliku FASTA. W tym celu zasadne będzie wykorzystanie funkcji range(), która pozwala na generowanie listy zawierającej liczby z deklarowanego przedziału, z deklarowanym krokiem.

{*} Wykorzystując plik z p.1 należy dokonać zmiany liczby znaków w wierszach i wyświetlić zawartość pliku FASTA po sformatowaniu lub utworzyć nowy plik zawierający nowe formatowanie.

Plik z punktu pierwszego:

with open('seq1.fa', 'r') as f:
    first = f.readline()        # odczyt pierwszej lini
    seqs = f.read()             # odczyt pozostałej zawartości
#zamknięcie bloku, automatycznie zamyka plik

Plik fasta

Seq1 [organism=Carpodacus mexicanus]
CCTTTATCTAATCTTTGGAGCATGAGCTGGCATAGTTGGAACCGCCCTCAGCCTCCTCATCCGTGCAGAA
CTTGGACAACCTGGAACTCTTCTAGGAGACGACCAAATTTACAATGTAATCGTCACTGCCCACGCCTTCG
TAATAATTTTCTTTATAGTAATACCAATCATGATCGGTGGTTTCGGAAACTGACTAGTCCCACTCATAAT
CGGCGCCCCCGACATAGCATTCCCCCGTATAAACAACATAAGCTTCTGACTACTTCCCCCATCATTTCTT
TTACTTCTAGCATCCTCCACAGTAGAAGCTGGAGCAGGAACAGGGTGAACAGTATATCCCCCTCTCGCTG
GTAACCTAGCCCATGCCGGTGCTTCAGTAGACCTAGCCATCTTCTCCCTCCACTTAGCAGGTGTTTCCTC
TATCCTAGGTGCTATTAACTTTATTACAACCGCCATCAACATAAAACCCCCAACCCTCTCCCAATACCAA
ACCCCCCTATTCGTATGATCAGTCCTTATTACCGCCGTCCTTCTCCTACTCTCTCTCCCAGTCCTCGCTG
CTGGCATTACTATACTACTAACAGACCGAAACCTAAACACTACGTTCTTTGACCCAGCTGGAGGAGGAGA
CCCAGTCCTGTACCAACACCTCTTCTGATTCTTCGGCCATCCAGAAGTCTATATCCTCATTTTAC

To co ja napisałem:

"with open('seq1.fa', 'r') as f:
    first = f.readline()        # odczyt pierwszej lini
    seqs = f.read()
    n = 4

    with open('new_seq1.fa', 'w') as new:
        for i in seqs(range(0, len(seqs), n)):
        "

Jednak nie wiem jak to napisać dalej. O co w tym dalej chodzi.

1

Jest już w bibliotece standardowej coś takiego jak textwrap.fill.

import textwrap

with open('/tmp/test.in', 'r') as f:
    header = f.readline().strip()
    text = f.read().replace('\n', '')

print(header)
print(textwrap.fill(text, 120))
$ python3 test.py 
Seq1 [organism=Carpodacus mexicanus]
CCTTTATCTAATCTTTGGAGCATGAGCTGGCATAGTTGGAACCGCCCTCAGCCTCCTCATCCGTGCAGAACTTGGACAACCTGGAACTCTTCTAGGAGACGACCAAATTTACAATGTAAT
CGTCACTGCCCACGCCTTCGTAATAATTTTCTTTATAGTAATACCAATCATGATCGGTGGTTTCGGAAACTGACTAGTCCCACTCATAATCGGCGCCCCCGACATAGCATTCCCCCGTAT
AAACAACATAAGCTTCTGACTACTTCCCCCATCATTTCTTTTACTTCTAGCATCCTCCACAGTAGAAGCTGGAGCAGGAACAGGGTGAACAGTATATCCCCCTCTCGCTGGTAACCTAGC
CCATGCCGGTGCTTCAGTAGACCTAGCCATCTTCTCCCTCCACTTAGCAGGTGTTTCCTCTATCCTAGGTGCTATTAACTTTATTACAACCGCCATCAACATAAAACCCCCAACCCTCTC
CCAATACCAAACCCCCCTATTCGTATGATCAGTCCTTATTACCGCCGTCCTTCTCCTACTCTCTCTCCCAGTCCTCGCTGCTGGCATTACTATACTACTAACAGACCGAAACCTAAACAC
TACGTTCTTTGACCCAGCTGGAGGAGGAGACCCAGTCCTGTACCAACACCTCTTCTGATTCTTCGGCCATCCAGAAGTCTATATCCTCATTTTAC
1

Jednak nie wiem jak to napisać dalej. O co w tym dalej chodzi.

>>> S = 'a' * 64

>>> k = 10

>>> [S[i:i+k] for i in range(0, len(S), k)]
['aaaaaaaaaa',
 'aaaaaaaaaa',
 'aaaaaaaaaa',
 'aaaaaaaaaa',
 'aaaaaaaaaa',
 'aaaaaaaaaa',
 'aaaa']

>>> 
0
Mózg napisał(a):

Jednak nie wiem jak to napisać dalej. O co w tym dalej chodzi.

>>> S = 'a' * 64

>>> k = 10

>>> [S[i:i+k] for i in range(0, len(S), k)]
['aaaaaaaaaa',
 'aaaaaaaaaa',
 'aaaaaaaaaa',
 'aaaaaaaaaa',
 'aaaaaaaaaa',
 'aaaaaaaaaa',
 'aaaa']

>>> 

Nie rozumiem tej linijki. [S[i:i+k] for i in range(0, len(S), k)] Co to za skrócony zapis i jak takie coś napisać do pliku przy użyciu open with

1
Morgotheron napisał(a):

Co to za skrócony zapis

To jest list comprehension, skrócony sposób tworzenia listy na podstawie innej listy. Można powiedzieć, że to Pythonowy sposób na map i filter.

W celu zapisania tego do pliku wystarczy po open width umieścić pętlę, która będzie iterować po tej liście i robić write do pliku.

0
with open('seq1.fa', 'r') as f:
    first = f.readline()        # odczyt pierwszej lini
    seqs = f.read().replace('\n', '')
    k=4
    new = [seqs[i:i + k] for i in range(0, len(seqs), k)]

    print(new)

Wyszło mi. Tylko zastanawia mnie ta część i:i + k
Jak przepisać to całę wyrażenie na pętle zwykłe, a nie na list comprahension

Próbowałem coś takiego

    for s in seqs(range(0, len(seqs), 4)):
        s = s + k
        new2.append(s)

    print(new2)

Po prostu kompletnie nie rozumiem w jaki sposób to zachodzi i czy to i:i + k to jest i = i + k czy co?

1

Ten fragment o który pytasz, to Pythonowy sposób na odwołanie do fragmentu listy (w tym przypadku napisu), to trochę odpowiednik JS-owego slice ale z większymi możliwościami:

S[i:i+k]

Oznacza to, że oczekujesz listę od elementu o indeksie "i" do elementu o indeksie "i+k".

Prostszy przykład:

lista = [1, 2, 3, 4, 5]
print(lista[2:4])

>> [3, 4]

Czyli oczekujemy elementów od 2 do 4 indeksu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1