Sprawdzenie plików w folderze przy użyciu Pythona

0

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 :)

4
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)

5
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'))
1

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.

2

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.

0

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

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