Dzień dobry,
sprawa wygląda następująco: mam w folderze pliki w pptx i w pdf (Jest to para o takiej samej treści np. 1234.pptx oraz 1234.pdf - każdy plik pdf nazywa się tak samo jak ten pptx) i mam z 11 tysięcy takich plików ale brakuje mi kilka plików w pdf więc potrzebuje napisać kod który wyłapie jaki plik pptx nie ma swojej pary w pdf. Jęśli ktoś ma jakiś sposób na to to chętnie go wysłucham. Z góry dziękuje i pozdrawiam :)

- Rejestracja:około 3 lata
- Ostatnio:około miesiąc
- Postów:44

- Rejestracja:ponad 5 lat
- Ostatnio:około miesiąc
- Lokalizacja:Wrocław
from pathlib import Path
CWD = Path(Path.cwd())
def get_files_by_extension(location: Path, extension: str) -> set[str]:
return {x.stem for x in location.iterdir() if extension in x.suffix}
def get_set_difference(set1: set[str], set2: set[str]) -> set[str] | set[None]:
return set1 - set2 if len(set1) > len(set2) else set2 - set1
pdf = get_files_by_extension(CWD, "pdf")
txt = get_files_by_extension(CWD, "txt")
final = get_set_difference(pdf, txt)

- Rejestracja:prawie 6 lat
- Ostatnio:około 7 godzin
- Postów:1002
import os.path
import glob
def get_files(extension):
return set(os.path.splitext(f)[0] for f in glob.glob(f'*.{extension}'))
print(get_files('pptx') - get_files('pdf'))
Jak chcesz sprawdzić czy nie ma któregokolwiek z pary (albo pptx albo pdf) to wygodnie użyć XOR na otrzymanych setach.
print(get_files('pptx') ^ get_files('pdf'))



- Rejestracja:około 3 lata
- Ostatnio:około miesiąc
- Postów:44
Bardzo wam dziękuję za szybką odpowiedź, obie wersje działają. Spearhead twój kod jest dla mnie bardziej przejrzysty chodź muszę się przyjrzeć linijce nr 5 bo nie do końca rozumiem jak to działa oraz w linijce 7 czemu ten ptaszek jest. (jestem początkującym, jeszcze nie umiem zbytnio pisać kodów). Natomiast ledi12 ma dla mnie bardziej skomplikowany kod którego w całości nie rozumiem. Jeszcze raz bardzo wam dziękuję, cieszę się że trafiłem na forum miłych ludzi :)
Jeśli macie jakieś dobre książki bądź kursy do polecenia w temacie pythona (coś o excelu, coś o tworzeniu pptx i coś ogólnie o automatyzacji różnych biurowych zadań jak to co dzisiaj robiłem) to bardzo chętnie skorzystam z każdej rady. Pozdrawiam i życzę miłego dnia.

- Rejestracja:prawie 6 lat
- Ostatnio:około 7 godzin
- Postów:1002
Mając zbiory (tworzone przy pomocy set
lub klamerek {}
) możesz wykonywać na nich operacje logiczne z użyciem odpowiednich operatorów:
>>> {'a', 'b', 'c'} & {'c', 'd', 'e'} # elementy, które są w obu zbiorach - AND
{'c'}
>>> {'a', 'b', 'c'} | {'c', 'd', 'e'} # elementy, które są w jednym lub drugim zbiorze - OR
{'e', 'c', 'b', 'd', 'a'}
>>> {'a', 'b', 'c'} - {'c', 'd', 'e'} # elementy, które są w pierwszym zbiorze, ale nie ma ich w drugim
{'b', 'a'}
>>> {'a', 'b', 'c'} ^ {'c', 'd', 'e'} # elementy, które są unikalne dla jednego ze zbiorów - XOR
{'e', 'b', 'a', 'd'}
A zatem get_files('pptx') - get_files('pdf')
usuwa ze zbioru nazw plików pptx te, które również mają wersję pdf, pozostawiając te, dla których go brakuje, a get_files('pptx') ^ get_files('pdf')
zwraca te nazwy, które są tylko w zbiorze plików pdf lub w zbiorze plików pptx (ale nie w obu).
glob.glob
to funkcja operująca na dopasowaniach, gdzie * dopasowuje dowolny znak, a ? pojedynczy (coś w rodzaju uproszczonego wyrażenia regularnego), zatem glob.glob("*.pdf")
dopasuje wszystkie pliki pdf. Rozszerzenie przekazuje jako argument w f-stringu, czyli glob.glob(f'*.{extension}')
zamieni się w glob.glob('*.pdf')
jeżeli wartość zmiennej extension
będzie równa pdf
. Iteruję po tym przy pomocy składni (i for i in iterable)
żeby na każdym elemencie wywołać funkcję os.path.splitext(f)
, która rozdziela nazwę od rozszerzenia. Ponieważ interesuje mnie tylko nazwa, a rozszerzenie odrzucam, zabieram element o zerowym indeksie z [0]
. Wszystko to idzie do konstruktora obiektu set
, który pozwoli mi na wykonanie wspomnianych wcześniej operacji na zbiorach.

- Rejestracja:około 3 lata
- Ostatnio:około miesiąc
- Postów:44
ok czyli kod wywoła do zbioru wszystkie pliki z tego folderu usunie im rozszerzenia z nazwy, a przy pomocy
get_files('pptx') - ge- get_files('pdf')
usunie ze zbioru wszystkie pptx które mają te same nazwy co pdf
a przy pomocy
get_files('pptx') ^ get_files('pdf')
z tych plików które zostały to zwróci mi tylko pdf

-
usunie ze zbioru plików pptx
nazwy plików pdf
, ^
zwróci te nazwy, które są unikalne dla obu zbiorów (albo jest dodatkowo w plikach pptx
albo dodatkowo w plikach pdf
) ignorując te, które są takie same w obu zbiorach.
