2

Downloads フォルダーからすべての音楽ファイルを取得し、それらを Music フォルダーに配置する簡単なプログラムを Python で作成しようとしています。Windows を使用しており、cmd プロンプトを使用してファイルを移動できますが、次のエラーが発生します。

WindowsError: [Error 2] The system cannot find the file specified

これが私のコードです:

#! /usr/bin/python

import os 
from subprocess import call

def main():
    os.chdir("C:\\Users\Alex\Downloads") #change directory to downloads folder

    suffix =".mp3"    #variable holdinng the .mp3 tag
    fnames = os.listdir('.')  #looks at all files

    files =[]  #an empty array that will hold the names of our mp3 files

    for fname in fnames:  
        if fname.endswith(suffix):
            pname = os.path.abspath(fname)
            #pname = fname
            #print pname

            files.append(pname)  #add the mp3 files to our array
    print files

    for i in files:
        #print i 
        move(i)

def move(fileName):
    call("move /-y "+ fileName +" C:\Music")
    return

if __name__=='__main__':main()

サブプロセスライブラリやその他の無数の記事を見てきましたが、何が間違っているのかまだわかりません。

4

3 に答える 3

7

このsubprocess.callメソッドは、文字列にユーザー入力からの何かを含めることができる場合は推奨されないシェルを使用するように指示しない限り、スペース区切り文字付きの文字列ではなくパラメーターのリストを取得します。

最良の方法は、コマンドをリストとして作成することです

例えば

cmd = ["move", "/-y", fileName, "C:\Music"]
call(cmd)

これにより、呼び出されたプログラムにスペースを含むパラメーター(パスやファイルなど)を簡単に渡すこともできます。

これらの方法は両方とも、サブプロセスのドキュメントに記載されています。

区切り文字列を渡すことはできますが、シェルに引数を処理させる必要があります

call("move /-y "+ fileName +" C:\Music", shell=True)

また、この場合、moveには、これを行うためのpythonコマンドがあります。shutil.move

于 2013-03-13T20:50:27.060 に答える
0

私はあなたの質問に直接答えているわけではありませんが、そのようなタスクでは、plumbuは素晴らしく、あなたの人生をとても楽にしてくれます。subprocessの API はあまり直感的ではありません。

于 2013-03-13T21:20:56.403 に答える
0

いくつかの問題が考えられます:

  1. fileNameその中にスペースが含まれている可能性があるため、moveコマンドはファイル名の一部しか認識しません。

  2. ifmoveは内部コマンドです。あなたはそれを実行する必要があるかもしれませんshell=True:

from subprocess import check_call

check_call(r"move /-y C:\Users\Alex\Downloads\*.mp3 C:\Music", shell=True)

.mp3を使用せずにダウンロード フォルダからミュージックにファイルを移動するにはsubprocess:

from glob import glob
from shutil import move

for path in glob(r"C:\Users\Alex\Downloads\*.mp3"):
    move(path, r"C:\Music")
于 2013-03-14T03:11:49.973 に答える