在计算md5 / sha1时,系统无法找到带空格的文件

时间:2014-01-28 15:59:32

标签: python

我编写了以下代码,为目录中可用的所有mp3文件生成哈希码。但是系统会为名称中有空格的文件引发错误

目录 - d:\ song

AB CD.mp3,Abc.mp3,GB.mp3

目录中的文件
import os

dirname = 'd:\song'

def walk(dirname):
    names = []
    for name in os.listdir(dirname):
        path = os.path.join(dirname,name)
        if os.path.isfile(path):
            names.append(path)
        else:
            names.extend(walk(path))
    return names

def chk_dup(f):
    for i in f:
        cmd = 'fciv -md5 %s' % i.replace(' ','')
        fp = os.popen(cmd)
        res = fp.read()
        print(res)
        fp.close()

chk_dup(walk(dirname))

输出

//
// File Checksum Integrity Verifier version 2.05.
//
d:\song\abcd.mp3\*

    Error msg  : The system cannot find the path specified.

    Error code : 3

//
// File Checksum Integrity Verifier version 2.05.
//
1a65b4c63d64f0634c1411d37629be3b d:\song\abc.mp3

//
// File Checksum Integrity Verifier version 2.05.
//
bbf47eb1cb3625eea648f0b6e0784fd3 d:\song\gb.mp3

2 个答案:

答案 0 :(得分:3)

您可以通过将所有文件路径名参数括在双引号中来解决您的直接问题,以防它们包含空格。这将使它被视为一个单独的参数而不是两个(或更多个),否则就是这种情况。

    for i in f:
        cmd = 'fciv -md5 "%s"' % i
        ...

但是,我建议您完全停止使用os.popen(),而不是仅仅这样做,因为it has been deprecated since Python version 2.6,而是使用推荐的subprocess模块。除了其他优点之外,这样做会自动处理带有空格的参数的引用。

此外,您还可以利用内置的os.walk()函数来简化自己的walk()函数。

合并这两个更改将导致代码如下所示:

import os
import subprocess

directory = r'd:\song'

def walk(dirname):
    for root, dirs, files in os.walk(dirname):
        for name in files:
            path = os.path.join(root, name)
            yield path

def chk_dup(files):
    for file in files:
        args = ['fciv', '-md5', file]  # cmd as sequence of arguments
        p = subprocess.Popen(args, stdout=subprocess.PIPE,
                                   stderr=subprocess.STDOUT)
        res = p.communicate()[0]  # communicate returns (stdoutdata, stderrdata)
        print res

chk_dup(walk(directory))

答案 1 :(得分:0)

您的文件是"AB CD.mp3",没有"ABCD.mp3"。因此,找不到文件"ABCD.mp3"

尝试使用'填写命令:

cmd = "fciv -md5 '%s'" % i
祝你好运!