2016-02-29 14 views
7

Tôi rất mới với python và chỉ cần cài đặt Eric6 Tôi muốn tìm kiếm một thư mục (và tất cả các thư mục phụ) để in tên tệp của bất kỳ tệp nào có phần mở rộng là .pdf. nó lỗi nóiIn tên tệp

chương trình sửa lỗi nêu ra ngoại lệ unhandled FileNotFoundError
"[WinError 3] hệ thống không thể tìm thấy con đường quy định 'C:'"
file: C: \ Users \ pcuser \ EricDocs \ Test.py, Dòng: 6

.210

Và đây là cú pháp tôi muốn thực hiện:

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

Có phải "C: \ Test" tên thư mục thực của bạn hay bạn đang ẩn danh thư mục đó vì thư mục thực là "C: \ users \ your_real_name" hay gì đó? – Kevin

+0

Tại sao 'cho thư mục trong testdir' ??? .. Bạn đang lặp qua chuỗi 'tesdir' thay vì không phải từng thư mục trong' testdir' –

+0

@Kevin - đó là thư mục thực mà tôi muốn quét. Tôi đã tạo một thư mục "Kiểm tra" và đặt một vài loại tệp khác trong đó để chạy đoạn mã này. –

Trả lời

9

Sử dụng mô-đun glob.

mô-đun Các glob tìm tất cả các tên đường dẫn phù hợp với một mô hình quy định

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

này sẽ làm việc trên Windows và * nix nền tảng.


Chỉ cần đảm bảo rằng đường dẫn của bạn được thoát hoàn toàn trên cửa sổ, có thể hữu ích khi sử dụng chuỗi thô.

Trong trường hợp của bạn, đó sẽ là:

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

Đối với chỉ một danh sách các tên tập tin (đường dẫn không đầy đủ, theo nhận xét của bạn), bạn có thể làm điều này một liner:

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

Mã này thực thi hoàn hảo! Một câu hỏi, bạn có thể sử dụng dấu nháy đơn hoặc kép trong python không? –

+0

Bạn có thể sử dụng một trong hai, nó chỉ là quy ước. –

+0

Tôi cũng thêm vào trong này vì tôi chỉ muốn tên tập tin không đầy đủ thông tin dir (nhưng tôi đã không nói rằng trong câu hỏi của tôi) in (os.path.basename (pdf_file)) –

2

Có một vài vấn đề trong mã của bạn, hãy xem làm thế nào tôi đã sửa đổi nó dưới đây:

import os 

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

print (results) 

Lưu ý rằng Tôi đã thoát khỏi tên đường dẫn của bạn và đã xóa if folder... đầu tiên của bạn. Điều đó đã không nhận được các thư mục như bạn mong đợi, nhưng thay vì chọn một ký tự của một chuỗi đường dẫn tại một thời điểm.

Bạn sẽ cần phải sửa đổi mã để làm cho nó nhìn qua tất cả các thư mục, hiện tại thì không. Hãy xem mô-đun glob.

1

Hãy thử testdir = r"C:\Test" thay vì testdir = "C:\Test". Trong python Bạn phải thoát khỏi các ký tự đặc biệt như ví dụ \. Bạn cũng có thể thoát chúng bằng biểu tượng '\' để nó có thể là "C:\\Test". Bằng cách sử dụng r"C:\Test", Bạn đang yêu cầu python sử dụng chuỗi thô.

Ngoài ra for folder in testdir: dòng không có ý nghĩa vì testdir là một chuỗi để bạn về cơ bản đang cố gắng lặp qua chuỗi.

+0

Sử dụng chuỗi thô để tránh các ký tự thoát ngẫu nhiên là một ý tưởng hay nói chung, nhưng tôi không không nghĩ rằng nó có trách nhiệm cho lỗi ở đây. "\ T" không thoát khỏi ký tự tab nếu T ở dạng mũ. – Kevin

+0

Thay đổi nó thành r "C: \ Test" tạo ra cùng một lỗi. –

+0

xóa 'cho thư mục trong testdir:' dòng và nó sẽ hoạt động –

3

Ngay bây giờ, bạn tìm kiếm từng chuỗi ký tự bên trong biến của testdir.

để tìm kiếm thư mục cho các giá trị "C", ":", "\", "T" v.v. Bạn cũng sẽ muốn thoát khỏi ký tự thoát của bạn như "C: \ ... \ ... \ "

Có thể bạn đã sử dụng os.listdir (testdir).

2

Thử chạy tập lệnh Python của bạn từ C:. Từ Command Prompt, bạn có thể muốn làm điều này:

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

Như đã chỉ ra bởi Tony Babarino, sử dụng r"C:\Test" thay vì "C:\Test" trong mã của bạn.

2

Bạn sẽ cần phải thoát khỏi dấu gạch chéo ngược trên cửa sổ và bạn có thể sử dụng os.walk để nhận tất cả các tệp pdf.

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

Bạn đang cơ bản lặp qua chuỗi testdir với for vòng đầu tiên sau đó đi qua từng nhân vật để os.listdir(folder) không thực hiện bất kỳ cảm giác sau đó, chỉ cần loại bỏ for vòng đầu tiên và sử dụng fnmatch phương pháp từ fnmatch mô-đun:

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) 
Các vấn đề liên quan