2016-02-29 118 views
7

我對python非常陌生,剛剛安裝了Eric6我想要搜索一個文件夾(和所有子目錄)來打印擴展名爲.pdf的任何文件的文件名我有這個作爲我的語法,但它錯誤說打印文件名

被調試程序引發的異常未處理FileNotFoundError
「[WinError 3]系統找不到指定的路徑 'C:'」
文件:C:\用戶\ pcuser \ EricDocs \ Test.py,Line:6

這是我想要執行的語法:

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:\ Test」你真實的實際目錄名稱,還是你匿名它,因爲真正的目錄是「C:\ users \ your_real_name」或什麼的? – Kevin

+0

爲什麼'在testdir文件夾???? ..你正在循環'tesdir'字符串而不是'testdir'中的每個文件夾。 –

+0

@Kevin - 這是我想要掃描的真實目錄。我創建了一個「測試」目錄,並在其中放置了一些diff文件類型以運行此片段。 –

回答

9

使用glob模塊。

glob模塊中找出所有匹配的文件路徑指定模式

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

這將在Windows和* nix平臺上工作。


只要確保您的路徑在Windows上完全轉義,可以使用原始字符串。

在你的情況,這將是:

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

因爲只有一個文件名列表(不完整路徑,按您的評論),你可以做到這一點的一行:

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

此代碼執行完美!一個問題,你可以在python中使用單引號或雙引號嗎? –

+0

你可以使用,只是慣例。 –

+0

我也在這添加,因爲我只想要文件名不完整目錄信息(但我沒有說在我的問題)print(os.path.basename(pdf_file)) –

2

有代碼中的幾個問題,看看我下面怎麼修改它:

import os 

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

print (results) 

注意我已經逃脫了你的路徑名稱,並刪除了你的第一個if folder...。這並沒有像預期的那樣獲取文件夾,而是一次選擇一個字符串中的一個字符。

您將需要修改代碼以使其能夠查看所有文件夾,但目前沒有。看看glob模塊。

1

嘗試testdir = r"C:\Test"而不是testdir = "C:\Test"。在Python中你必須轉義特殊字符,例如\。你也可以用符號'\'將它們轉義出來,所以它會是"C:\\Test"。通過使用r"C:\Test",您正在告訴python使用raw字符串。

for folder in testdir:行沒有意義,因爲testdir是一個字符串,所以你基本上是試圖遍歷一個字符串。

+0

使用原始字符串避免意外轉義字符是一個好主意,但我不會不認爲這是對這裏的錯誤負責。如果T在大寫字母中,「\ T」不會轉義爲製表符。 – Kevin

+0

將其更改爲r「C:\ Test」會產生相同的錯誤。 –

+0

刪除'testdir:'文件夾中的文件,它會工作 –

3

現在,您可以搜索testdir變量中的每個字符串。

因此,它正在搜索文件夾中的值「C」,「:」,「\」,「T」等您還希望逃脫您的轉義字符,如「C:\ ... \ ... \「

您可能會改爲使用os.listdir(testdir)。

2

嘗試從C:運行您的Python腳本。從命令提示符,你可能想這樣做:

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

正如託尼Babarino指出,在代碼中使用r"C:\Test"代替"C:\Test"

2

你將需要在Windows上轉義反斜槓,你可以使用os.walk來獲得所有的pdf文件。

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

您通過串testdir基本迭代與第一for環路,則每個字符傳遞給os.listdir(folder)沒有任何意義的話,剛剛卸下第一for迴路,並使用fnmatch方法從fnmatch模塊:

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)