Wpis z mikrobloga

Ludzki #programowanie #python

Kod tutaj: https://pastebin.com/ti7Yq3fq

Co miał robić program:

Docelowo miał pobrać dane od użytkownika, a potem pozamieniać konkretne wartości w przygotowanych wcześniej plikach docx (takich jakby szablonach). Takie szybkie generowanie powtarzalnych formularzy i wniosków.

Po kolei kodu może nie będę tłumaczył, coś tam pomógł chat gpt, ale najważniejsze:
mamy słownik wszystkich gotowych formularzy z parami kluczy i wartości gdzie klucz to rzecz podmieniana a po dwukropku już gotowa wartość (docelowo wiadomo, będę pytał użytkownika). Podmiana też nie zmienia stylu formatowania tekstu w plikach.

Później mamy pętlę, gdzie w zależności od tego, jaką cyfrę podał użytkownik, do pustego słownika kopiujemy wartość z tego głównego słownika. Później pary kluczy i wartości są używane w metodzie i generują docelowy plik.

Jako że jestem na początku swojej przygody z programowaniem i się tak wdrażam to jak widzicie jakieś rażące błędy to dawajcie znać, chętnie poczytam i na 100% się czegoś też nauczę. Na dzień dobry już mi nie pasuje, że w pętli mam jeżeli warunek == 1 to, analogicznie jeżeli warunek == 2 to itd. Na bank się da to jakoś poprawić.

Docelowo chciałbym, żeby użytkownik mógł wpisać nie tylko jedną cyfrę, np. 1, 2, 4, ale na tę chwilę nie umiem sformułować warunku, bo w obecnej chwili wyszedłby z tego niemały potwór.

Aha, wiem, że nie ma to żadnej walidacji i nie sprawdza w żaden sposób użytkownika, ale na to przyjdzie jeszcze czas.
  • 14
@ozzi91: Jest to zdecydowanie bardziej zagmatwane niż mogło by być, a objawem tego jest na przykład to, że funkcja
replacetextindocx efektywnie pracuje na słowniku z jednym tylko kluczem. Słownik z jednym kluczem nie ma racji bytu, dane których potrzebujesz są w słowniku zagnieżdżonym w środku, tam jak najbardziej ma on sens. Zauważ że iterujesz po docreplacements.items() tylko raz, po to żeby wyciągnąć do osobnej zmiennej jedyny klucz
@ozzi91: Dalej - widzimy że w wywołaniu tej funkcji występuje teraz dwa razy ten sam literał "zdO.docx". Skąd ta redundancja? Bierze się ona stąd że w dictOfRecepientRequests przechowujemy akurat docxpath jako klucz i replacements jako wartość. Nie musimy więc przekazywać za każdym części dictOfRecepientRequests, wystarczy przekazać klucz i już wiemy skąd wziąć replacements - z dictOfRecepientRequests[docxpath]. Funkcja replacetextindocx ma teraz postać:

def replace_text_in_docx(docx_path):
replacements = dictOfRecepientRequests[docx_path]
doc = docx.Document(docx_path)
...

a
@ozzi91: Dobrze Ci świta że da się pozbyć tych ifów. Potrzebne jest mapowanie liczb, które wpisuje użytkownik, na docxpath. Można to zrobić na wiele sposobów, na przykład definiując dodatkowy słownik:

choices_map = {
'1': "zdO.docx",
'2': "umigO.docx",
}

wtedy zupełnie pozbywasz się tych ifów a wywołanie funkcji zawsze wygląda tak samo:

replace_text_in_docx(choices_map[chosenRecepients])
Jednak teraz mamy dwa słowniki a literały takie jak "zdO.docx" są kluczami jednego a wartościami drugiego, można więc pokusić
via Android
  • 0
@Calka_internowana po pierwsze, wielkie dzięki za odpowiedź.

części merytorycznej nie sprawdzę teraz, pewnie dopiero wieczorem ale ma to oczywiście sens.

bardzo ważna uwaga co do zmiennych - uczyłem się z jakiegoś kursu na udemy i tam właśnie zmienne były pisane aaaaBaaaaCaaa stąd te zmienne u mnie ale już będę się stosował do tego nazewnictwa.

i przy okazji: dużo wiecej trzeba na juniora? :Do
. Potrzebne jest mapowanie liczb, które wpisuje użytkownik, na docxpath. Można to zrobić na wiele sposobów, na przykład definiując dodatkowy słownik:


@Calka_internowana: do mapowania liczb nie jest potrzebny słownik, wystarczy zwykła tablica, chyba że przewidujesz dziury w numeracji.
  • 0
@Calka_internowana: przetestowane, działa super, ale wychodzi na to, że "pythondocxreplace" nie daje rady podmieniać tekstu napisanego w polach tekstowych.

Wniosek do jednego urzędu jest udostępniany w pdf z polami które można wypełnić bezpośrednio w przeglądarce pdfów. Stwierdziłem, że może przekonwertuje sobie wniosek do docx, ale jak to bywa, wykrzaczyło bo wniosek ma dużo grafik, kolumn i innych problematycznych rzeczy. Myślałem, że obejdę to poprzez pola tekstowe.

Pola tekstowe, tak