我正在尝试使用.m4a
将文件从.mp3
转换为ffmpeg
,我需要访问音乐文件夹。
此文件夹的路径名为:C:\\Users\A B\Desktop\Music
我无法使用subprocess.call()
访问它,因为只有C:\\Users\A
被识别。不处理空白区域。
这是我的python脚本:
import constants
import os
import subprocess
path = 'C:\\Users\A B\Desktop\Music'
def main():
files = sorted(os.listdir(path), key=lambda x: os.path.getctime(os.path.join(path, x)))
if "Thumbs.db" in files: files.remove("Thumbs.db")
for f in files:
if f.lower()[-3:] == "m4a":
process(f)
def process(f):
inFile = f
outFile = f[:-3] + "mp3"
subprocess.call('ffmpeg -i {} {} {}'.format('C:\\Users\A B\Desktop\Music', inFile, outFile))
main()
当我运行它时,我收到一条错误消息:
C:\ Users \ A:没有这样的文件或目录
我想知道某些人是否知道如何在C:\Users\A B\Desktop\Music
中填写我的完整路径名subprocess.call()
)?
答案 0 :(得分:5)
预先编辑:是否为空格,以下命令行-i <directory> <infilename> <outfilename>
不正确ffmpeg
,因为它需要-i
选项,然后输入文件和输出文件,而不是目录。所以你在这里遇到了不止一个问题(这解释了&#34;权限被拒绝&#34;你有消息,因为ffmpeg
试图将目录作为文件打开!)
我想你想:
在这种情况下,您可以为您的输入和输入添加引号输出这样的绝对文件:
subprocess.call('ffmpeg -i "{0}\{1}" "{0}\{2}"'.format('C:\\Users\A B\Desktop\Music', inFile, outFile))
这样可行,但这不是最好的事情:性能不是很好,当你已经拥有所有参数时使用format
,你可能不知道要逃脱的其他角色,等......不要重新发明轮子。
最好的方法是在列表中传递参数,以便subprocess
模块在必要时处理引用/转义:
path = r'C:\Users\A B\Desktop\Music' # use raw prefix to avoid backslash escaping
subprocess.call(['ffmpeg','-i',os.path.join(path,inFile), os.path.join(path,outFile)])
除此之外:如果你是有问题的用户,那就更好了:
path = os.getenv("USERPROFILE"),'Desktop','Music'
您甚至可以使用path
选项在cwd
目录中运行该过程:
subprocess.call(['ffmpeg','-i',inFile, outFile],cwd=path)
如果您不是,请确保使用提升权限运行脚本,否则您将无法访问其他用户目录(读保护)