2016-02-29 22 views
7

Jestem bardzo nowy dla python i właśnie zainstalowałem Eric6 Chcę przeszukać folder (i wszystkie podkatalogi), aby wydrukować nazwę pliku dowolnego pliku o rozszerzeniu .pdf Mam to jako moją składnię, ale błędy go mówiącDrukowanie nazw plików

debugowanemu Program podniesiony wyjątek nieobsługiwany FileNotFoundError
"[WinError 3] System nie może odnaleźć określonej ścieżki 'C:'"
pliku: C: \ Users \ pcuser \ EricDocs \ Test.py, Linia: 6

I to jest składnia Chcę wykonać:

import os 

results = [] 
testdir = "C:\Test" 
for folder in testdir: 
    for f in os.listdir(folder): 
    if f.endswith('.pdf'): 
     results.append(f) 

print (results) 
+0

Czy "C: \ Test" oznacza rzeczywistą nazwę katalogu, czy też anonimizujesz ją, ponieważ prawdziwy katalog to "C: \ users \ your_real_name" lub coś innego? – Kevin

+0

Dlaczego 'dla folderu w testdir' ??? .. Pętlasz ciąg 'tesdir' zamiast nie każdego folderu w' testdir' –

+0

@Kevin - to jest prawdziwy katalog, który chcę skanować. Stworzyłem katalog "Test" i umieściłem w nim kilka typów plików diff, aby uruchomić ten fragment kodu. –

Odpowiedz

9

Użyj modułu glob.

Moduł glob znajdzie wszystkie ścieżki: pasujące do podanego wzorca

import glob, os 
parent_dir = 'path/to/dir' 
for pdf_file in glob.glob(os.path.join(parent_dir, '*.pdf')): 
    print (pdf_file) 

To będzie działać na Windows i * nix platformy.


Wystarczy upewnić się, że ścieżka jest całkowicie uciekł na oknach, może być przydatny do wykorzystania surowego ciąg.

W twoim przypadku, to byłoby:

import glob, os 
parent_dir = r"C:\Test" 
for pdf_file in glob.glob(os.path.join(parent_dir, '*.pdf')): 
    print (pdf_file) 

Tylko listy nazw plików (nie pełne ścieżki, jak na swój komentarz) można to zrobić jedną wkładkę:

results = [os.path.basename(f) for f in glob.glob(os.path.join(parent_dir, '*.pdf')] 
+0

Ten kod działa perfekcyjnie! Jedno pytanie, czy możesz użyć pojedynczych lub podwójnych cudzysłowów w pythonie? –

+0

Możesz użyć jednego, to tylko konwencja. –

+0

Dodałem również, że chciałem tylko, aby nazwy plików nie były pełne info (ale nie powiedziałem tego w moim pytaniu) print (os.path.basename (plik_pdf)) –

2

Istnieje kilka problemów w kodzie, przyjrzeć się, jak mam zmodyfikowano go poniżej:

import os 

results = [] 
testdir = "C:\\Test" 
for f in os.listdir(testdir): 
    if f.endswith('.pdf'): 
     results.append(f) 

print (results) 

Należy pamiętać, że Uciekłem Twojej nazwy ścieżki i usunąłem twoją pierwszą if folder.... To nie było uzyskiwanie folderów zgodnie z oczekiwaniami, ale raczej wybieranie znaku ciągu ścieżek po jednym na raz.

Będziesz musiał zmodyfikować kod, aby przeglądał wszystkie foldery, a obecnie nie. Spójrz na moduł glob.

1

Wypróbuj testdir = r"C:\Test" zamiast testdir = "C:\Test". W pytonie Musisz uciec od znaków specjalnych, jak na przykład \. Możesz uciec z nich także symbolem "\", więc będzie to "C:\\Test". Korzystając z r"C:\Test", mówisz pythonowi, aby używał surowego ciągu znaków.

Również linia for folder in testdir: nie ma sensu, ponieważ testdir jest ciągiem więc zasadniczo próbujesz iterować po ciągu znaków.

+0

Używanie nieprzetworzonych ciągów znaków w celu uniknięcia przypadkowych znaków ucieczki jest ogólnie dobrym pomysłem, ale ja nie Myślę, że to on odpowiada za błąd tutaj. "\ T" nie ucieka do znaku tabulacji, jeśli T jest w czapkach. – Kevin

+0

Zmiana na r "C: \ Test" powoduje ten sam błąd. –

+0

usuń 'dla folderu w testdir:' line i zadziała –

3

W tym momencie przeszukujesz każdy ciąg znaków wewnątrz zmiennej testdira.

, więc szuka w folderze wartości "C", ":", "\", "T" itp. Będziesz także chciał uciec swojej ucieczce jak "C: \ ... \ ... \ "

Prawdopodobnie użyłeś zamiast tego os.listdir (testdir).

2

Spróbuj uruchomić skrypt w języku Python od C:. Z wiersza poleceń, może chcesz to zrobić:

> cd C:\  
> python C:\Users\pcuser\EricDocs\Test.py 

Jak zauważył Tony Babarino użyć r"C:\Test" zamiast "C:\Test" w kodzie.

2

Będziesz musiał uciec z ukośnika w oknach i możesz użyć os.walk, aby uzyskać wszystkie pliki pdf.

for root,dirs,files in os.walk(testdir): 
     for f in files: 
      if f.endswith('.pdf'): 
      results.append(f) 
    print (results) 
2

Jesteś w zasadzie iteracja ciągu testdir z pierwszym for pętli następnie przechodząc każdy znak do os.listdir(folder) nie ma sensu wtedy, po prostu usuń ten pierwszy for pętli i używać fnmatch metodę z fnmatch modułu:

import os 
from fnmatch import fnmatch 

ext = '*.pdf' 
results = [] 
testdir = "C:\Test" 
for f in os.listdir(testdir): 
    if fnmatch(f, ext): 
     results.append(f) 

print (results) 
Powiązane problemy