Sprawdzenie plików w folderze przy użyciu Pythona

Sprawdzenie plików w folderze przy użyciu Pythona
Paweł Gerc
  • Rejestracja:około 3 lata
  • Ostatnio:około miesiąc
  • Postów:44
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 :)

ledi12
  • Rejestracja:ponad 5 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Wrocław
4
Kopiuj
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)


Robię http response status cody w martwych ciągach
edytowany 1x, ostatnio: ledi12
Spearhead
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 7 godzin
  • Postów:1002
5
Kopiuj
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.

Kopiuj
print(get_files('pptx') ^ get_files('pdf'))
edytowany 2x, ostatnio: Spearhead
ledi12
Fakt, zapomniałem o xorze ; )
Paweł Gerc
ja nawet nie znam XOR ale chętnie poczytam o tym :D
Paweł Gerc
  • Rejestracja:około 3 lata
  • Ostatnio:około miesiąc
  • Postów:44
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.

Spearhead
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 7 godzin
  • Postów:1002
2

Mając zbiory (tworzone przy pomocy set lub klamerek {}) możesz wykonywać na nich operacje logiczne z użyciem odpowiednich operatorów:

Kopiuj
>>> {'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.

edytowany 3x, ostatnio: Spearhead
Paweł Gerc
  • Rejestracja:około 3 lata
  • Ostatnio:około miesiąc
  • Postów:44
0

ok czyli kod wywoła do zbioru wszystkie pliki z tego folderu usunie im rozszerzenia z nazwy, a przy pomocy

Kopiuj
get_files('pptx') - ge- get_files('pdf')

usunie ze zbioru wszystkie pptx które mają te same nazwy co pdf

a przy pomocy

Kopiuj
 get_files('pptx') ^ get_files('pdf')

z tych plików które zostały to zwróci mi tylko pdf

Spearhead
- 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.
Paweł Gerc
no tak, to działa jako minus (od pptx usuń pdf) i tak naprawdę już to by wystarczyło bo usuwa od pptx pdfy o tej samej nazwie i zostają tylko te których nazw nie było w pdf :) więc tutaj mogę zastosować albo to z ptaszkiem albo to z minusem efekt jest ten sam, Dziękuje już rozumiem :)
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)