• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

dodanie zer wiodących do danych z pliku

Object Storage Arubacloud
0 głosów
289 wizyt
pytanie zadane 28 lutego 2023 w Python przez benek111 Początkujący (260 p.)

Dziękuję za odpowiedź.

Mam działający wzorzec:

 

print(re.sub(r';(\d)(?=[^0-9])', r';0\1', contents))

linia kodu: przeszukuje plik i dopisuje '0' jeśli dana składa się z jednej cyfry.

W pliku są też dane składające się z 4 lub 5 znaków , potrzebuję żeby wyrównać je do 5 znaków dodając zero wiodące.

zrobi mi to kod:

print(re.sub(r';(\d)|(\d{4})(?=[^0-9])', r';0\1', contents))

 

Chciałem połączyć to co robi kod z tych dwóch linii, żeby dopisywać zera do danych 1 lub 4 znakowych.

Myślałem użyć użyć grupowania, znaku '|'  (\d)|(\d{4} )   #1 znak lub 4 znaki )

 

print(re.sub(r';(\d)|(\d{4})(?=[^0-9])', r';0\1', contents))

Ale coś jest nie  tak. ( przyznam, że po raz pierwszy w życiu usiłuje napisać coś w Pythonie) .

Jeśli możesz na to zerknąć co robię źle?

 


 
 

 

komentarz 28 lutego 2023 przez Iei Obywatel (1,950 p.)
Jeżeli pierwszy raz w życiu piszesz w pythonie i zaczynasz od wyrażeń regularnych, to i tak nieźle :) ja zaczynałem od hello world
komentarz 28 lutego 2023 przez benek111 Początkujący (260 p.)
Tak, ale trochę już żyje na tym świecie. Zaczynałem w Basicu, Pascal, FreePascal. Poprawiało się kody w C++. C#, HTML, PHP, skrypty, SQL, wstawki ASM, sterowniki PLC. Dlatego wiem co chcę zrobić ale składnia i instrukcje czy funkcje są inne w różnych językach. Programowanie to nie jest moje główne zajęcie ale czasami nie ma wyjścia trzeba coś poprawić. Dlatego wolę spytać kolegów dla, których jest to chleb powszedni bo zrobią to raz dwa. A mnie "uczenie się od nowa" zajmie dużo czasu a to i tak "na jeden raz", potem przez lata mogę już tego nie robić. Sami wiecie, że znaleźć dobre opisy (wytłumaczenie) jest ciężko. Chyba, że macie dobre opisy z przykładami.

1 odpowiedź

0 głosów
odpowiedź 28 lutego 2023 przez VBService Ekspert (253,100 p.)

Możesz dla zachowania lepszej czytelności kodu "rozbić" to na dwie linijki kodu np.

contents = re.sub(r';(\d)(?=[^0-9])', r';0\1', contents)
contents = re.sub(r';(\d{4})(?=[^0-9])', r';0\1', contents)
print(contents)

lub zapisać "połączone" wyrażenie np. tak

print(re.sub(r';(\d(?=[^0-9])|\d{4}(?=[^0-9]))', r';0\1', contents))

 

przykład on-line (w podanym przykładzie liczba 2023, pomimo, że ma 4 cyfry nie jest brana pod uwagę, ponieważ jest poprzedzona znakiem końca linii (\n), a podany wzorzec szuka liczb bezpośrednio pomiędzy ;...; (średnikami)

komentarz 2 marca 2023 przez benek111 Początkujący (260 p.)

Dziękuję bardzo. Mam prawie wszystko. Na razie kod wygląda tak:

import re
import os

path = r'\\192.168.110.200\rcp\a'
os.chdir(path)


with open("Zdarzenia.csv", 'r') as file:
    contents = file.read()

#print(contents)

# 1
print()
contents = re.sub(r';(\d)(?=[^0-9])', r';0\1', contents)
contents = re.sub(r';(\d{4})(?=[^0-9])', r';0\1', contents)
print(contents)

file = open("skonwertowany.txt", 'w')
print(contents, file=file)
file.close()

Zostały mi dwie rzeczy:

1. Plik do odczytu ma w rzeczywistości taki wzorzec:

regex = r"Zdarzenia_([0-9]{4})_([0-9]{2})_([0-9]{2})_([0-9]{2})_([0-9]{2})\.csv"

W nazwie jest po prostu data i godzina.

Po odczycie jest przetwarzany i usuwany. Tak, że zawsze jest jeden plik w katalogu ale z różna datą i godziną w nazwie..

Potrzebuję tak zmienić kod, żeby odczytywany był plik według wzorca regex a nie plik o stałej nazwie Zdrzenia.csv. 

Proszę przynajmniej o podpowiedź jakiej funkcji użyć?

2. Dodać do nazwy pliku wynikowego datę i godzinę. Tu raczej nie powinno być problemu. skorzystam z import datetime, 

datetime.datetime.now()

 

komentarz 2 marca 2023 przez VBService Ekspert (253,100 p.)
edycja 2 marca 2023 przez VBService

Spróbuj np. tak

[ on-line ]

import re
import os

# dla prezentacji "wyłaczone"
#path = r'\\192.168.110.200\rcp\a'

# dla prezentacji - ponieważ plik "main.py" znajduje się
# w foderze z plikiem (plikami)
path = os.getcwd() # pobierz bierzącą sieżkę, skąd uruchomionu jest skrypt
 
prefix = "Zdarzenia_"

for filename in os.listdir(path):
    if os.path.isfile(os.path.basename(filename)) and filename.startswith(prefix):
        #print(filename)
        with open(filename, 'r') as file:
            contents = file.read()

        contents = re.sub(r';(\d)(?=[^0-9])', r';0\1', contents)
        contents = re.sub(r';(\d{4})(?=[^0-9])', r';0\1', contents)
        #print(contents)
        
        new_filename = os.path.splitext(os.path.basename(filename))[0].replace(prefix, "skonwertowany_")
        #print(new_filename)

        with open(new_filename + ".txt", 'w') as file:
            file.write(contents)

 

1
komentarz 6 marca 2023 przez benek111 Początkujący (260 p.)
Wielkie dzięki. Działa.

    Na początku miałem trochę problemów z uruchomieniem kodu. Ale teraz już wiem, że w Pythonie rozmiar ma znaczenie - wcięć, oczywiście. A ja, głupi, przeglądając kody w Pyhtonie zastanawiałem się gdzie są nawiasy  separujące bloki kodu.

    Co do samego kodu, to po wykonaniu następowała taka sytuacja, że po pierwszym przejściu było ok. Plik wynikowy miał swoją nazwę  = prefix + data_z_pliku wsadowego.

Natomiast po kolejnych przejściach mimo, że plik wsadowy zmieniał nazwę plik wynikowy miał zawsze tę samą nazwę ( z pierwszego przejścia, nadpisywał się po prostu). Po usunięciu pliku wynikowego, za pierwszym przejściem było ok. Po kolejnych przejściach to samo.

Analizowałem kod ... nic nie wymyśliłem. A, że potrzebowałem zapisywać plik wynikowy w innym miejscu niż wsadowy, dopisałem linijkę zmieniającą katalog docelowy i ...... zaczęło działać. Plik wynikowy zmienia nazwę tak jak plik wsadowy.

Mówią, że liczy się efekt końcowy a nie jak do niego doszło. Ale mnie to męczy.

Jeszcze raz dziękuję.

Podobne pytania

0 głosów
0 odpowiedzi 330 wizyt
+1 głos
2 odpowiedzi 302 wizyt
0 głosów
0 odpowiedzi 925 wizyt
pytanie zadane 27 lutego 2019 w Python przez Dawid89 Obywatel (1,100 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...