Zaznaczenie wybranego zakresu linii w pliku

0

Cześć,
Chciałbym wyszukać wybrany zakres linii w pliku, a potem z tego wybranego zakresie wyszukać słowo i zastąpić je własnym. Słowo to powtarza się co jakiś czas w tekście, a chce go zmienić tylko w jednym miejscu.

Tekst w pliku:

Notatka 1 -
George Washington[1] (forma spolszczona: Jerzy Waszyngton)[2] (ur. 11 lutego?/22 lutego 1732[a] w Pope’s Creek[w innych językach],
zm. 14 grudnia 1799 w Mount Vernon) – amerykański generał, polityk, mąż stanu, wódz naczelny Armii Kontynentalnej (1775–1784),
deputowany do Kongresu Kontynentalnego, pierwszy prezydent Stanów Zjednoczonych (1789–1797), mason[3].
Uważany jest za ojca narodu amerykańskiego

Notatka 2 -
Thomas Jefferson (ur. 2 kwietnia?/13 kwietnia 1743[a] w Shadwell (Wirginia),
zm. 4 lipca 1826 w Charlottesville) – amerykański prawnik,
działacz niepodległościowy, archeolog, architekt, trzeci prezydent USA (1801–1809),
mason, jeden z autorów Deklaracji niepodległości Stanów Zjednoczonych,
założyciel stanowego Uniwersytetu Wirginii.

Notatka 3 -
Theodore Roosevelt (ur. 27 października 1858 w Nowym Jorku,
zm. 6 stycznia 1919 w Oyster Bay) – amerykański polityk,
dwudziesty szósty prezydent USA (1901–1909) oraz dwudziesty piąty wiceprezydent (1901), mason,
laureat Pokojowej Nagrody Nobla za rok 1906.

Notatka 4 -
Abraham Lincoln (ur. 12 lutego 1809 pod Hodgenville,
zm. 15 kwietnia 1865 w Waszyngtonie) – amerykański polityk, mąż stanu, szesnasty prezydent Stanów Zjednoczonych, uczestnik wojny Czarnego Jastrzębia.
Zasiadał przez dwa lata jako przedstawiciel Partii Wigów w Izbie Reprezentantów.
W 1860 roku z sukcesem ubiegał się o nominację Partii Republikańskiej na urząd Prezydenta Stanów Zjednoczonych.
W głosowaniu powszechnym zwyciężył i piastowanie urzędu rozpoczął 4 marca 1861 roku, mason.
Trzy lata później ponownie został kandydatem partii na urząd prezydenta i został wybrany na drugą kadencję.
Jego życie i prezydentura zakończyły się 15 kwietnia 1865 roku śmiercią w wyniku zamachu dokonanego przez Johna Wilkesa Bootha

Chciałbym zaznaczyć tekst z "Notatki 2" a w niej zamienić słowo "ur." na "urodził się"

Na razie zrobiłem coś takiego żeby zaznaczyć Zakres zmian:

Def zmiana_nazwy()
nowa_lista =[]
zawartosc = open(plik.txt, 'r').read()
linie = zawartosc.split('\n')
for linia in linie:
if "Notatka 2" in linia:
    nowa_lista.append(linia)
    if"Notatnik 3" in line and "\n" in nowa_lista[-1]
        nowa_lista.append(linia)
        break 

Czy ktoś ma jakiś pomysł jak zaznaczyć zakres "Notatka 2"?

0

Nie wiem czy dobrze rozumiem ale może to coś pomoże:

with open('plik.txt', 'r') as plik:
    for linia in plik:
        if linia.startswith('Notatka 2'):
            linia_zmieniona = linia.replace('ur.', 'urodzony')
            print(linia_zmieniona)
0

no przede wszystkim trzeba wiedzieć, kiedy Notatka się KOŃCZY. A jak to już będziesz wiedział to znasz nr linii początkowej i końcowej i we wszystkich liniach z tego zakresu szukasz tego co chcesz zamienić

0

Tak masz rację, ale wiem tylko jak zaznaczyć początek szukanej notatki, ale nie wiem jak mam zadeklarować koniec notatki

Początek może wyglądać tak:

for linia in linie:
    if "Notatka 2" in linia:

Dodać pod if'em kolejną pętlę?

0
abrakadaber napisał(a):

no przede wszystkim trzeba wiedzieć, kiedy Notatka się KOŃCZY. A jak to już będziesz wiedział to znasz nr linii początkowej i końcowej i we wszystkich liniach z tego zakresu szukasz tego co chcesz zamienić

Sorry, źle sformatowałem plik źródłowy. "ur" nie zawsze jest w drugiej linii, czasem jest w link 3,4 lub 5. Dlatego pomysł zaznaczenia notatki a potem edycji "ur"

0

Jako koniec proponuje użyć 'Notatka n+1' jeżeli będzie więcej wystąpień 'ur' do zamiany

0
for linia in linie:
    if "Notatka 2" in linia:
        licznik = licznik+ 1
    elif "Notatka" in line and "\n" in line[-1]
        licznik = licznik + 1

Tak sprawdzić początek i koniec notatki? W warunku podałem \n ponieważ przed każdą notatką jest enter

0

Jeżeli zaczynasz np w 'Notatka 2' to kończysz w 'Notatka 3' (lub koniec pliku)

text = "Notatka 1"
ostatni_znak = text[-1]
if ostatni_znak.isdigit():  # Sprawdzamy, czy ostatni znak jest cyfrą
    ostatni_znak = int(ostatni_znak) + 1
    print(f'Notatka {ostatni_znak}')
0

Całość możesz zrobić np tak

poczatek : str = 'Notatka 2'
koniec : str = 'Notatka 3'
nr_linii_poczatkowej : int = 0
nr_linii_koncowej : int = 0

with open(r"plik_wejsciowy.txt", 'r') as plik_wejsciowy:
   
    for numer_linii, linia in enumerate(plik_wejsciowy):
        if poczatek in linia:
            nr_linii_poczatkowej = numer_linii   
        if koniec in linia:
            nr_linii_koncowej = numer_linii
    plik_wejsciowy.seek(0)  # Przesunięcie wskaźnika pliku na początek
    
    with open(r"plik_wyjsciowy.txt", 'w') as plik_wyjsciowy:

        for nr_linii, linia in enumerate(plik_wejsciowy):
           
            if nr_linii>nr_linii_poczatkowej and nr_linii<nr_linii_koncowej:
                linia = linia.replace('ur.','urodził się')
                plik_wyjsciowy.write(linia)
            else:
                plik_wyjsciowy.write(linia)
0

Super działa, dziękuję

0

Chciałbym teraz wprowadzić zmiany dla wszystkich notatek. Jak zmieniłem punkt początkowy i końcowy to zmienia się tylko ostatnio znaleziona notatka. Wprowadziłem coś takiego że przerobiłem zmienne nr linii początkowej oraz końcowej na tablicę i dodałem kolejnego fora żeby sprawdzał elementy z tablicy, ale wyszła pętla która się nie kończy

poczatek : str = 'Notatka 1
koniec : str = 'Notatka'
tablica_linii_poczatkowej = []
tablica_linii_koncowej = []


with open(r"plik_wejsciowy.txt", 'r') as plik_wejsciowy:
   
    for numer_linii, linia in enumerate(plik_wejsciowy):
        if poczatek in linia:
            tablica_linii_poczatkowej.append(numer_linii) 
        if koniec in linia and "\n" in linia:
            tablica_linii_koncowej.append(numer_linii)
    plik_wejsciowy.seek(0)  # Przesunięcie wskaźnika pliku na początek
    
    with open(r"plik_wyjsciowy.txt", 'w') as plik_wyjsciowy:

        for nr_linii, linia in enumerate(plik_wejsciowy):
            for nr_linii_poczatkowej in tablica_linii_poczatkowej:
                for nr_linii_koncowej in tablics_linii_koncowej:
                    if nr_linii>nr_linii_poczatkowej and nr_linii<nr_linii_koncowej:
                        linia = linia.replace('ur.','urodził się')
                        plik_wyjsciowy.write(linia)
                    else:
                        plik_wyjsciowy.write(linia)
0

@Telefoniak poprawiłem ifa, ale teraz w pliku dostałem po 5 razy ten sam tekst

if nr_linii>=nr_linii_poczatkowej and nr_linii<=nr_linii_koncowej:
0

Jeżeli chcesz dla całego pliku (tak to rozumiem bo tak jest w przykładzie na początku) to wystarczy:

poczatek: str = 'Notatka 1'
koniec: str = 'Bootha' # ostatnie słowo z pliku 
nr_linii_poczatkowej: int = 0
nr_linii_koncowej: int = 0

with open(r"plik_wejsciowy.txt", 'r', encoding='utf-8') as plik_wejsciowy:
    for numer_linii, linia in enumerate(plik_wejsciowy):
        if poczatek in linia:
            nr_linii_poczatkowej = numer_linii
        if koniec in linia:
            nr_linii_koncowej = numer_linii
    plik_wejsciowy.seek(0)  # Przesunięcie wskaźnika pliku na początek

    with open(r"plik_wyjsciowy.txt", 'w', encoding='utf-8') as plik_wyjsciowy:

        for nr_linii, linia in enumerate(plik_wejsciowy):

            if nr_linii >= nr_linii_poczatkowej and nr_linii <= nr_linii_koncowej:
                linia = linia.replace('ur.', 'urodził się')
                plik_wyjsciowy.write(linia)
            else:
                plik_wyjsciowy.write(linia)
0

Tak zamienia mi to wszędzie, działa to super, ale zamienia mi też to slowo w pozycjach opis gdzie ma tego nie zamieniać

0

to jest mój cały pik. Zawsze po notatce występuje opis w którym znajduje się również "ur."

Notatka 1 -
George Washington[1] (forma spolszczona: Jerzy Waszyngton)[2] (ur. 11 lutego?/22 lutego 1732[a] w Pope’s Creek[w innych językach],
zm. 14 grudnia 1799 w Mount Vernon) – amerykański generał, polityk, mąż stanu, wódz naczelny Armii Kontynentalnej (1775–1784),
deputowany do Kongresu Kontynentalnego, pierwszy prezydent Stanów Zjednoczonych (1789–1797), mason[3].
Uważany jest za ojca narodu amerykańskiego

Opis 1
Washington 
George Wymowa, Jerzy Waszyngton, ur. 22 II 1732, hrab. Westmoreland (stan Wirginia), zm. 14 XII 1799, Mount Vernon (tamże),
polityk amerykański, pierwszy prezydent Stanów Zjednoczonych.
22 II 1732 ur w hrabstwie Westmoreland (stan Wirginia)
1752 został właścicielem plantacji Mount Vernon
1753–59 oficer amerykańskich sił zbrojnych w wojnie francusko-brytyjskiej
1759–74 członek legislatury kolonii Wirginia
1760–74 sędzia w hrabstwie Fairfax
1774–75 członek Kongresu Kontynentalnego
1775 mianowany dowódcą Armii Kontynentalnej
1781 przyjął kapitulację armii brytyjskiej pod Yorktown
1789–97 pierwszy prezydent Stanów Zjednoczonych
14 XII 1799  zmarł w Mount Vernon (stan Wirginia)

ur 22 II 1732 w hrabstwie Westmoreland (stan Wirginia). Nie miał formalnego wykształcenia, po śmierci ojca przebywał w Mount Vernon i pracował jako geometra; 1751–52 wraz z przyrodnim bratem, Lawrencem, odwiedził Barbados. Od 1752 był właścicielem plantacji w Mount Vernon, posiadaczem niewolników (wyznawał poglądy konserwatywne). W 1753–59 oficer amerykański sił zbrojnych, podczas wojny francusko-brytyjskiej 1755 organizował obronę zachodniej granicy Wirginii; 1759 zrezygnował ze służby wojskowej; po poślubieniu Marthy Dandridge Custis zamożny plantator wirgiński. W 1759–74 był członkiem legislatury kolonii Wirginia, 1760–74 sędzią w hrabstwie Fairfax; 1774–75 członek Kongresu Kontynentalnego, 1775 mianowany dowódcą Armii Kontynentalnej, organizował i szkolił oddziały milicji, rekrutował ochotników do regularnego wojska, tworzył zalążki floty amerykańskiej.
Wojna o niepodległość Stanów Zjednoczonych
Podczas wojny o niepodległość Stanów Zjednoczonych zmusił Brytyjczyków do ewakuacji Bostonu (17 III 1776), następnie poniósł klęskę, broniąc Nowego Jorku i wycofał oddziały amerykańskie do New Jersey; zimą na przełomie 1776 i 1777 odniósł sukcesy pod Trenton i Princeton, później przegrał bitwy pod Brandywine Creek (11 IX 1777) i Germantown (4 X), nie zdołał utrzymać Filadelfii i wycofał wojsko na leża zimowe do Valley Forge; 1778 odparł atak Brytyjczyków pod Montmouth (28 VI), a 17 X 1781 pod Yorktown przyjął kapitulację wojsk brytyjskich generała Ch. Cornwallisa, która zadecydowała o wyniku wojny o niepodległość. Po przejęciu przez Amerykanów Nowego Jorku XII 1783 ustąpił ze stanowiska naczelnego wodza, zrzekł się żołdu i powrócił do swojej posiadłości.
Współautor konstytucji, prezydent
W 1776 był uczestnikiem konwencji w Annapolis, 1787 przewodniczył konwencji konstytucyjnej w Filadelfii, opracowującej Konstytucję Stanów Zjednoczonych; 4 II 1789 został jednomyślnie wybrany na pierwszego prezydenta USA, 30 IV zaprzysiężony w Nowym Jorku, w orędziu zadeklarował politykę jednoczenia unii i reprezentowania interesów całego narodu; 1789 utworzył pierwszy rząd (mianował: sekretarzem stanu — T. Jeffersona, sekretarzem skarbu — A. Hamiltona, sekretarzem wojny — H. Knoxa, prokuratorem generalnym — E. Randolpha), wprowadził zasadę mianowania i odwoływania ministrów przez prezydenta; w pierwszej kadencji stosował zasadę równowagi w obsadzaniu stanowisk i neutralności wobec walki stronnictw politycznych; przyczynił się do wprowadzenia silnej polityki pieniężnej i podatkowej, przyspieszającej spłatę długu narodowego, 1791 poparł utworzenie silnego Banku Stanów Zjednoczonych. W 1792 jednomyślnie wybrany na drugą kadencję (1793–97); jako zwolennik silnej władzy centralnej zaczął popierać działania A. Hamiltona i partię federalistów; w polityce zagranicznej był zwolennikiem niewiązania się w sojusze z innymi krajami — 1793 ogłosił neutralność Stanów Zjednoczonych w wojnie francusko-brytyjskiej; 1794 doprowadził do uregulowania kwestii granicznych z Wielką Brytanią (tzw. traktat Jaya), a 1795 — stosunków z Hiszpanią (traktat w San Lorenzo), uzyskując dla Amerykanów swobodę żeglugi po Missisipi i ustalając południową granicę USA.
W trakcie jego administracji doszło do powstania pierwszych amerykańskich partii politycznych oraz Banku Stanów Zjednoczonych; 9 IX 1796 wystosował adres pożegnalny do narodu, w którym opublikował zasady, którymi winny się kierować w przyszłości Stany Zjednoczone, w tym zasadę neutralności. Od 1797 przebywał w Mount Vernon, gdzie odwiedził go między innymi Polak J. Ursyn Niemcewicz, który napisał potem jego pierwszą biografię. W 1798 został mianowany przez J. Adamsa dowódcą tworzącej się armii amerykanskiej podczas nie wypowiedzianej wojny z Francją. Zmarł 14 XII 1799 w Mount Vernon (stan Wirginia). Autor The Diares of George Washington (t. 1–6 1976–80).

Notatka 2 -
Thomas Jefferson (ur. 2 kwietnia?/13 kwietnia 1743[a] w Shadwell (Wirginia),
zm. 4 lipca 1826 w Charlottesville) – amerykański prawnik,
działacz niepodległościowy, archeolog, architekt, trzeci prezydent USA (1801–1809),
mason, jeden z autorów Deklaracji niepodległości Stanów Zjednoczonych,
założyciel stanowego Uniwersytetu Wirginii.

Opis 2
Jefferson Thomas Wymowa, ur. 13 IV 1743, Old Shadwell (stan Wirginia), zm. 4 VII 1826, Monticello (tamże),
amerykański polityk, przywódca polityczny w okresie walki o niepodległość, prezydent Stanów Zjednoczonych.

13 IV 1743
urodził się w Old Shadwell (stan Wirginia)
1767 zaczął prowadzić kancelarię adwokacką
1769 został członkiem zgromadzenia Wirginii
1775 członek Kongresu Kontynentalnego
1776 współautor Deklaracji niepodkegłości Stanów Zjednoczonych
1779–81 bernator Wirginii
1790–93  sekretarz stanu w rządzie G.Washingtona
1797–1815 prezes Amerykańskiego Towarzystwa Filozoficznego
1797–1801 wiceprezydent Stanów Zjednoczonych u boku J. Adamsa
1801–09 prezydent Stanów Zjednoczonych
1819–26 rektor Uniwersytetu Wirginii w Charlottesville
4 VII 1826 zmarł w Monticello (stan Wirginia)


Notatka 3 -
Theodore Roosevelt (ur. 27 października 1858 w Nowym Jorku,
zm. 6 stycznia 1919 w Oyster Bay) – amerykański polityk,
dwudziesty szósty prezydent USA (1901–1909) oraz dwudziesty piąty wiceprezydent (1901), mason,
laureat Pokojowej Nagrody Nobla za rok 1906.

opis 3 - 
Roosevelt Theodore Wymowa, ur. 27 X 1858, Nowy Jork, zm. 6 I 1919, Oyster Bay k. Nowego Jorku,
amerykański polityk, prawnik, republikanin, prezydent Stanów Zjednoczonych.
Theodore "Teddy" Roosevelt przyszedł na świat w zamożnej nowojorskiej rodzinie w 1858 r. Jako dziecko był chorowity. Za cel obrał sobie poprawę zdrowia i nabranie tężyzny fizycznej, co konsekwentnie realizował poprzez aktywność fizyczną w rodzaju boksu, wioślarstwa czy polowań. Ukończył Harvard w 1880 r. i rozpoczął studia w Szkole Prawa Uniwersytetu Columbia, jednak nie ukończył studiów, gdyż postanowił ubiegać się o urząd. (Jego siostrzenica, Eleanor Roosevelt, wyszła w późniejszym czasie za jego odległego kuzyna, Franklina Delano Roosevelta, stając się pierwszą damą USA w latach 30-tych XX wieku.)
Roosevelt szybko piął się w górę drabiny politycznej. Markę wyrobił sobie jako przeciwnik korupcji w biznesie i polityce. Sławę zdobył dowodząc podczas wojny amerykańsko-hiszpańskiej pułkiem kawalerii zwanym Surowymi Jeźdźcami. Następnie został gubernatorem stanu Nowy Jork. Popularność, którą do 1901 r. zyskał jako bohater wojny na Kubie, pomogła mu sięgnąć po urząd wiceprezydenta podczas drugiej kadencji Williama McKinley'a.
Wkrótce doszło do tragedii. McKinley zginął w zamachu zaledwie rok po wyborach. Teddy Roosevelt przejął jego obowiązki jako prezydent Stanów Zjednoczonych. W wieku 42 lat był najmłodszą osobą, która objęła ten urząd.

Notatka 4 -
Abraham Lincoln (ur. 12 lutego 1809 pod Hodgenville,
zm. 15 kwietnia 1865 w Waszyngtonie) – amerykański polityk, mąż stanu, szesnasty prezydent Stanów Zjednoczonych, 
uczestnik wojny Czarnego Jastrzębia.
Zasiadał przez dwa lata jako przedstawiciel Partii Wigów w Izbie Reprezentantów.
W 1860 roku z sukcesem ubiegał się o nominację Partii Republikańskiej na urząd Prezydenta Stanów Zjednoczonych.
W głosowaniu powszechnym zwyciężył i piastowanie urzędu rozpoczął 4 marca 1861 roku, mason.
Trzy lata później ponownie został kandydatem partii na urząd prezydenta i został wybrany na drugą kadencję.
Jego życie i prezydentura zakończyły się 15 kwietnia 1865 roku śmiercią w wyniku zamachu dokonanego przez Johna Wilkesa Bootha

opis 4 -
Lincoln Abraham Wymowa, ur. 12 II 1809, w pobliżu Hodgenville (stan Kentucky), zm. 15 IV 1865, Waszyngton,
amerykański polityk, prawnik, prezydent Stanów Zjednoczonych.

12 II 1809 urodził się w pobliżu Hodgenville (stan Kentucky)
1834–40 zasiadał w stanowym zgromadzeniu ustawodawczym Illinois
1836 został adwokatem
1847–49 członek Izby Reprezentantów
1856 wstąpił do Partii Republikańskiej
1861 został prezydentem Stanów Zjednoczonych
1862 doprowadził do przyjęcia Homestead Act
1863 wydał proklamację o emancypacji niewolników
15 IV 1865 zmarł, śmiertelnie postrzelony, w Waszyngtonie
0

Początek i koniec mam wprowadzić do pętli while lub for?

0

Nie wiem jak zrobić numerację z 'n' bo no wiem ile będzie jeszcze notatek i opisów. W tej chwili tylko ostatnia notatka w pliku jest edytowana. Co muszę jeszcze dodać żeby każda notatka poza opisami była edytowania?

poczatek: str = 'Notatka'
koniec: str = 'Opis'
nr_linii_poczatkowej: int = 0
nr_linii_koncowej: int = 0

with open(r"plik_wejsciowy.txt", 'r', encoding='utf-8') as plik_wejsciowy:
    for numer_linii, linia in enumerate(plik_wejsciowy):
        if poczatek in linia:
            nr_linii_poczatkowej = numer_linii
        if koniec in linia and '/n' in linia[-1]:
            nr_linii_koncowej = numer_linii
    plik_wejsciowy.seek(0)  # Przesunięcie wskaźnika pliku na początek

    with open(r"plik_wyjsciowy.txt", 'w', encoding='utf-8') as plik_wyjsciowy:

        for nr_linii, linia in enumerate(plik_wejsciowy):

            if nr_linii >= nr_linii_poczatkowej and nr_linii <= nr_linii_koncowej:
                linia = linia.replace('ur.', 'urodził się')
                plik_wyjsciowy.write(linia)
            else:
                plik_wyjsciowy.write(linia)
1

Nie ma sprawdzania przypadków skrajnych ale powinno wystarczyć

poczatek: str = 'Notatka'
koniec: str = 'Opis'
numery_linii: list[int] = [] #z napisem Notatka,Opis,opis

def czy_w_przedzialach(x:int, przedzialy:list)->bool:
    for przedzial in przedzialy:
        if x >= przedzial[0] and x <= przedzial[1]:
            return True
    return False

with open(r"plik_wejsciowy.txt", 'r', encoding='utf-8') as plik_wejsciowy:
    for numer_linii, linia in enumerate(plik_wejsciowy):
        if poczatek in linia or koniec in linia or koniec.lower() in linia:
            numery_linii.append(numer_linii)

    print(f'{numery_linii = }')

    lista_z_krotkami = []
    for i in range(0, len(numery_linii), 2):
        lista_z_krotkami.append((numery_linii[i], numery_linii[i + 1]))

    print(f'{lista_z_krotkami = }')

    plik_wejsciowy.seek(0)  # Przesunięcie wskaźnika pliku na początek

    with open(r"plik_wyjsciowy.txt", 'w', encoding='utf-8') as plik_wyjsciowy:
        print('Numery linii w których sprawdzana jest możliwość zamiany:')
        for nr_linii, linia in enumerate(plik_wejsciowy):

            if czy_w_przedzialach(nr_linii, lista_z_krotkami):
                linia = linia.replace('ur.', 'urodził się')
                print(nr_linii, end=',')
                plik_wyjsciowy.write(linia)
            else:
                plik_wyjsciowy.write(linia)
0

@Telefoniak jesteś genialny, dziękuję

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