Odczyt odpowiedniej zawartości pliku txt i modyfikowanie w Pythonie

0

Witam Serdecznie Szanownych Grupowiczów!

Jestem początkujący w Pythonie

Potrzebuję w pliku txt (są to wyciągi bankowe), w których muszę zmieniać i ujednolicać daty, oczywiście daty do zmiany muszę wcześniej odczytać jakie znajdują się w pliku i zamienię je przez replace na właściwe, daty w txt są zawsze po kilku różnych ciągach tekstowych i tak:

Daty występujące w pliku:

  1. :20:200211 czyli data po ":20:"
  2. :60F:C200211 czyli data po ":60F:C"
  3. :60F:D200312 czyli data po ":60F:D"
  4. :61:200213 czyli data po ":61:"
  5. :62F:C200312 czyli data po ":62F:C"
  6. :62F:D200112 czyli data po ":62F:D"

W kodzie poniżej mam tylko możliwość odczytania pliku i ręcznie zmieniam datę w replace
chciałbym najpierw wydobyć te daty, które mam po tych ciągach powyżej bo bywają różne
i muszę je potem zamienić na jedną datę przez replace np. tylko tu pytanie jak wydobyć z txt
daty źródłowe do zmiany dla replace.

Uprzejmie proszę Szanowne Grono Grupowiczów i doświadczonych w Pythonie o pomoc.

def open_file():
filename = fd.askopenfilename(filetypes=[("Plik tekstowy","*.txt")]) # wywołanie okna dialogowego open file

if filename:
    zrodlo = open(filename). readlines()
    nowyplik=filename+"poprawiony.txt"
    cel = open(nowyplik, "w")

        datadocelowa="200215" # na razie ręcznie ale odczytam wpisaną wcześniej z entry lub cosik

    for s in zrodlo:
        cel. write (s. replace ('200212', datadocelowa))
        cel.close

...kod

0

Dla tych przykładów które podałeś, można np. regexem:

import re

zrodlo = open(filename)
for line in zrodlo:
    m = re.search('(\\d{6})',line)
    if m != None:
        print(m.group(1))
0

Dziękuję bardzo za info, a możesz mi pomóc jak wpleść powyższe warunki bo coś nie umiem sobie do końca poradzić.

0

Daty w pliku występują tylko w takich przypadkach:

:20:200211 czyli data po ":20:"
:60F:C200211 czyli data po ":60F:C"
:60F:D200312 czyli data po ":60F:D"
:61:200213 czyli data po ":61:"
:62F:C200312 czyli data po ":62F:C"
:62F:D200112 czyli data po ":62F:D"

a skrypt zrzucił mi także inne ciągi tekstowe występujące także np po ciągu ":25:" tam nie ma daty, potrzebuję tylko i wyłącznie uzyskać datę występującą w pliku po poniższych ciągach (data w formacie 200203, 6 znakowym rok 2 znaki, miesiąc 2 znaki, dzień 2 znaki), następnie potrzebuję uzyskać daty, które wielokrotnie występują po tych ciągach, jest ich spora ilość.
:20:
:60F:C
:60F:D
:61:
:62F:C
:62F:d
I niestety nadal nie umiem sobie z tym poradzić. Uprzejmie proszę o pomoc w temacie.

0

{1:F01373885 }{2:O940 373885 N}{4:
:20:200211/373885
:25:10889000010037388520000002
:28:4145/1
:60F:C200212PLN52651,96
:61:200210C707,49FMSCNONREF //1
oplata za XXX m-c02
:86:31132015371253879130000001
LUDWIKA XXXXXXXXKOLEJOWA 3749-315 XXXXXXXX
oplata za XXXXXXXX XXXXXXXXXXXXXXX
:61:200210C762,39FMSCNONREF //2
OPLATA ZA XXXXX W Z
:86:46102036680000510204126637
ANNA MARIA XXXXXX. ZIELONY XXX 1046-100 NOWE XXXXXXXXX
OPLATA ZA XXXXXXXXX MIESIAC LUTY 2020 R. .SUKIENNIKJAN
INA
:62F:C200211PLN54121,84
-}

To jest plik zawierający kilka wyciągów, a potrzebuję ujednolicać daty w plikach gdzie ilość wyciągów będzie większa, i potrzebuje zmieniać wszystkie daty występujące za wcześniej podanymi ciągami dodam, że wszystkie te daty, ale tylko te za podanymi wcześniej ciągami muszę zmienić na jedną datę, którą będę podawał w jakiejś zmiennej powiedzmy datadocelowa.

0

Jeszcze załącznik z plikiem

0
SanchoPansa napisał(a):

Daty w pliku występują tylko w takich przypadkach:
...
:20:
:60F:C
:60F:D
:61:
:62F:C
:62F:d

Jeśli przyjąć, że daty występują tylko za tymi początkami

import re

start_with = [':20:',':60F:C',':60F:D',':61:',':62F:C',':62F:D']

zrodlo = open(filename)
for line in zrodlo:                                 #dla kazdej linii pliku
    for sw in start_with:                           #poczatki linii
        m = re.search('^' + sw + '(\\d{6})',line)   #szukanie dopasowania
        if m != None:                               #jezeli dopasowanie istnieje
            print(m.group(1))                       #wyswietl
            break                                   #przerwij petle (for sw in start_with:)
                                                    #znalezeiono wiec nie sprawdzamy dalej

# regex
# ^ - poczatek linii
# sw - element z start_with
# (\\d{6}) - d decimal, 6 cyfr + pobierz dopasowanie dzięki ()

Poczytaj o wyrażeniach regularnych albo szukaniu w stringu.

0

Bardzo, bardzo dziękuję super łopatologicznie "koniecznie jak dla mnie na tym etapie", poczytam o wyrażeniach regularnych i jeszcze raz bardzo, bardzo dzięki za pomoc i naukę. Pozdrawiam Serdecznie.

1

Nie wiem czy dobrze patrze, ale wygląda na to że to co dostajesz jest w formacie SWIFT
https://www.rabobank.com/en/i[...]swift-mt940-structured-en.pdf
i tam w tym pdf masz ładnie opisane co każde pole oznacza. A skoro jest to standard to na pewno ktoś wymyślił już bibliotekę do pythona zeby to parsować, a nie się regexami męczyć.
Może coś tutaj (nie wiem, nie używałem nigdy, nie sprawdzałem możliwości):
https://pypi.org/project/python-swiftclient/
i wtedy pewnie dostaniesz datę w obiekcie pythona i będzie działać lepiej niż te regexowe zabawki.

0

Dzięki, popatrzę na ten moduł, ale na tym etapie na razie działam z regexami i jest ok.
Jeszcze raz dzięki piękne.
Pozdrawiam

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