使用更改到目录时出错os.chdir公司for循环中的python

2024-10-01 05:03:44 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,我有这个脚本,它可以把目录中的所有flv视频文件转换成mp4格式。在

我让它的工作只是把所有的文件放在一个目录,但现在需要修改它,使它进入该目录中的文件夹,并转换它遇到的每个文件夹中的文件。在

这是我的密码

sourcedirectory="/home/dubit/Desktop/test/"

class ConvertToMP4:
    def __init__(self):
        self.flvfiles = []

    def fetch_flv_files(self, directory_name):
        print("Scanning directory: " + directory_name)
        for (dirpath, dirnames, filenames) in os.walk(directory_name):
            for files in filenames:
                if files.endswith('.flv'):
                    print('convert file: ' + files)
                    self.flvfiles.append(files)

    def convert_flv_file_to_mp4_file(self):
        # check to see if the list is empty, if not proceed
        num_of_dir = len(list(os.walk(sourcedirectory)))
        if len(self.flvfiles) <= 0:
            print("No files to convert!")
            return
        for x in range(num_of_dir):
            for (dirpath, dirnames, filenames) in os.walk(sourcedirectory):
                for z in dirpath:
                    os.chdir(z)
                    for flvfiles in filenames:
                        mp4_file = flvfiles.replace('.flv','.mp4')
                        cmd_string = 'ffmpeg -i "' + flvfiles + '" -vcodec libx264 -crf 23 -acodec aac -strict experimental "' + mp4_file + '"'
                        print('converting ' + flvfiles + ' to ' + mp4_file)
                        os.system(cmd_string)


def main():
    usage = "usage: %prog -d <source directory for flv files>"
    parser = OptionParser(usage=usage)
    parser.add_option("-d","--sourcedirectory",action="store",
        type="string", dest="sourcedirectory", default="./",
        help="source directory where all the flv files are stored")
    (options, args) = parser.parse_args()
    flv_to_mp4 = ConvertToMP4()
    flv_to_mp4.fetch_flv_files(sourcedirectory)
    flv_to_mp4.convert_flv_file_to_mp4_file()
    return 0

main()

这是我收到的错误

^{pr2}$

我是python脚本的新手,所以还没有真正掌握解决这个问题的知识,所以任何帮助都将不胜感激。如果让我猜一猜,它只是从dirpath变量中取第一个字符。在


Tags: toinselfforosdeffilesdirectory
2条回答

您得到的错误是由于dirpath实际上是一个字符串,而不是字符串列表。os.walk()返回一个元组,其中dirpath是当前正在遍历的目录,dirnames和{}是{}的内容。在

由于字符串在Python中是iterable的,所以不会出现任何解释器错误,而是循环使用dirpath字符串中的每个字符。就像, for i, c in enumerate("abcd"): print('index: {i}, char: {c}'.format(i=i, c=c)) 将输出 index: 0, char: a index: 1, char: b index: 2, char: c index: 3, char: d

所以,您应该chdir()dirpath,而不是循环它。文件系统的循环由os.walk()在内部完成。在

dirpath是一个单个字符串。当您使用for循环(for z in dirpath)对其进行迭代时,您将迭代字符串'/home/dubit/Desktop/test/'中的每个单独字符!首先z被设置为'/',然后'h'。。。这就是chdir失败的地方,因为根目录中没有名为h的目录。在


就换一个

for z in dirpath:
    os.chdir(z)

^{pr2}$

并相应地调整缩进量,这样就可以工作了。在

相关问题 更多 >