1. 程式人生 > >Python呼叫Windows CMD命令刪除檔案異常分析與解決

Python呼叫Windows CMD命令刪除檔案異常分析與解決

       Windows下偶爾需要用到使用Python呼叫系統中的命令處理某些東西,在處理檔案的時候偶爾會遇到問題。問題基本上都會與Windows的CMD命令使用有關,而我對這個不是很熟悉。剛剛嘗試進行檔案的批量刪除發現遇到點小問題,做個簡單的小例子說明一下。

       以下是用於測試的目錄以及檔案的目錄樹結構:

卷序列號為 00000031 2013:5089

E:.

│ exp_01.py

├─q a

│     a()【】1.txt

└─【】()

       a c.txt

       寫一個Python指令碼如下:

#!/usr/bin/python

import os

pwd = os.getcwd()

forroot,dirs,files in os.walk('./'):

       os.chdir(root)

       for each_file in files:

              print("removing %s in%s" %(each_file,root))

              try:

                     os.system("del%s" % each_file)

              except:

                     print("remove %sfailed!" % each_file)

       os.chdir(pwd)

       執行結果如下;

E:\WorkSpace\01_程式語言\04_Python\exp_01>python exp_01.py

removing a()【】1.txt in ./q a

removing a c.txtin ./【】()

找不到E:\WorkSpace\01_程式語言\04_Python\exp_01\【】()\a

       還不錯,只有一個錯誤報出來了。在看一下現在的目錄樹資訊:

資料夾 PATH 列表

卷序列號為 000000E32013:5089

E:.

│  exp_01.py

├─q a

└─【】()

        a c.txt

       由此大致可以得出這樣的結論:程式切換目錄的時候用的是Python自帶的功能,即使是呼叫了作業系統的介面在使用上也可以看做是Python固有的特性。而通過os模組呼叫系統功能的時候,呼叫的功能原則上是需要跟作業系統上功能使用方式完全一樣。這樣,出現的問題就是因為”a c.txt”的方式被識別成了兩個被空格分開的引數。我做了一下嘗試,其實這種情況下把不能夠分開的檔名用引號引起來,便是正確的用法。於是,恢復被刪除改動過的環境,再次修改程式碼如下;

#!/usr/bin/python

import os

pwd = os.getcwd()

forroot,dirs,files in os.walk('./'):

       os.chdir(root)

       for each_file in files:

              if each_file != 'exp_01.py':

                     print("removing %s in%s" %(each_file,root))

                     try:

                            os.system("del%s" % ('"'+each_file+'"'))

                     except:

                            print("remove%s failed!" % each_file)

       os.chdir(pwd)

程式執行結果:

E:\WorkSpace\01_程式語言\04_Python\exp_01>python exp_01.py

removing a()【】1.txt in ./q a

removing a c.txtin ./【】()

再看一下目錄樹;

資料夾 PATH 列表

卷序列號為 000000F92013:5089

E:.

│  exp_01.py

├─q a

└─【】()

       這次執行中沒有遇到異常,所有檔案都被成功刪除掉。需要注意的是,程式碼中重新“包裝”Windows CMD命令列的時候,在不能分割的檔名兩邊加的是雙引號,這個是必須如此的。不像Python中單引號雙引號的使用沒有什麼區別,在Windows的CMD命令中這個倒是十分固定的。