2

I'm trying to write a simple program in Python that takes all the music files from my Downloads folder and puts them in my Music folder. I'm using Windows, and I can move the files using the cmd prompt, but I get this error:

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

Here's my code:

#! /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()

I've looked at the subprocess library and countless other articles, but I still have no clue what I'm doing wrong.

4

3 回答 3

7

subprocess.call方法获取参数列表而不是带有空格分隔符的字符串,除非您告诉它使用外壳程序,如果字符串可以包含来自用户输入的任何内容,则不推荐使用外壳程序。

最好的方法是将命令构建为列表

例如

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

这也使得将带有空格的参数(例如路径或文件)传递给被调用程序变得更加容易。

这两种方式都在子流程文档中给出。

你可以传入一个分隔字符串,但你必须让 shell 处理参数

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

同样在这种情况下,对于 move 有一个 python 命令来执行此操作。shutil.move

于 2013-03-13T20:50:27.060 回答
0

我没有直接回答你的问题,但对于这样的任务,很棒,会让你的生活更轻松。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 回答