18

プロジェクトのルートから「prepend」で始まるすべてのファイルを削除する関数を構築しようとしています。これが私がこれまでに持っているものです

def cleanup(prepend):
    prepend = str(prepend)
    PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
    end = "%s*" % prepend
    cmd = 'rm'
    args = "%s/%s" % (PROJECT_ROOT, end)
    print "full cmd = %s %s" %(cmd, args)
    try:
        p = Popen([cmd, args],  stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True).communicate()[0]
        print "p", p
    except Exception as e:
        print str(e)

運が悪いです - 何もしていないようです。私が間違っているかもしれないアイデアはありますか?ありがとうございました!

4

3 に答える 3

17

次の代わりにos.remove()を使用してファイルを削除するこのアプローチを検討しますかrm

import os
os.remove('Path/To/filename.ext')

更新(基本的に、コメントを下から回答に移動します)

os.remove()ワイルドカードを単独で処理できないため、 glob モジュールを使用すると、このSO answerから逐語的に繰り返されるソリューションが得られます。

import glob
import os
for fl in glob.glob("E:\\test\\*.txt"):
    #Do what you want with the file
    os.remove(fl)
于 2012-06-14T02:12:29.943 に答える
17

問題は、2 つの引数をsubprocess.Popen:に渡していることと、 (接頭辞が の場合)rmなどのパスです。次に、正確に次のように名前が付けられたファイルを削除しようとします: t の後に最後にアスタリスクが続きます。/home/user/t*tPopen

Popenワイルドカードを使用する場合は、shellパラメーターを として渡す必要がありますTrue。ただし、この場合、コマンドは引数のリストではなく、文字列にする必要があります。

Popen("%s %s" % (cmd, args), shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)

(それ以外の場合、引数のリストは command ではなく、新しいシェルに渡されます)

より安全で効率的な別の解決策は、モジュールを使用することglobです

import glob
files = glob.glob(prepend+"*")
args = [cmd] + files
Popen(args,  stdin=PIPE, stdout=PIPE, stderr=PIPE)

ただし、全体として、levon ソリューションの方が適切であることに同意します。この場合、glob答えも次のとおりです。

files = glob.glob(prepend+"*")
for file in files:
    os.remove(file)
于 2012-06-14T02:23:34.370 に答える
0

私はこのようなことを試してみます(これはWindowsでも機能しますが、それはあなたにとって問題ではないと思います:

def cleanup(prepend):
    prepend = str(prepend)
    PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
    for file_to_delete in [file for file in os.listdir(PROJECT_ROOT) if file.startswith(prepend)]:
        os.remove(file_to_delete)
于 2012-06-14T02:49:01.453 に答える