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. 200211 czyli data po ""
  2. C200211 czyli data po "C"
  3. D200312 czyli data po "D"
  4. 200213 czyli data po ""
  5. C200312 czyli data po "C"
  6. D200112 czyli data po "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 "" 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ść.

C
D

C
d
I niestety nadal nie umiem sobie z tym poradzić. Uprzejmie proszę o pomoc w temacie.

0

{1:F01373885 }{2:O940 373885 N}{4:
200211/373885
10889000010037388520000002
4145/1
C200212PLN52651,96
200210C707,49FMSCNONREF //1
oplata za XXX m-c02
31132015371253879130000001
LUDWIKA XXXXXXXXKOLEJOWA 3749-315 XXXXXXXX
oplata za XXXXXXXX XXXXXXXXXXXXXXX
200210C762,39FMSCNONREF //2
OPLATA ZA XXXXX W Z
46102036680000510204126637
ANNA MARIA XXXXXX. ZIELONY XXX 1046-100 NOWE XXXXXXXXX
OPLATA ZA XXXXXXXXX MIESIAC LUTY 2020 R. .SUKIENNIKJAN
INA
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:
...

C
D

C
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/images/format-description-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