python subprocess.call []不能对带空格的文件进行操作

时间:2015-04-06 15:25:30

标签: python for-loop space cp

我在Linux上的目录中有一个文件列表:

files 1.pdf
files 2.pdf
files.pdf
files 3.pdf

我已将所有内容分配到列表中:

>>> files_destino = [f for f in os.listdir("./espacio/")]

当我执行for循环时,它会列出文件,即使它有空格。

   >>> for i in files_destino:
...     print i
... 
files 1.pdf
files 2.pdf
files.pdf
files 3.pdf

但是当我试图做一个" cp"或" rsync"或者对它们的任何其他命令看起来好像它们不存在,除了没有空格的那些。

    >>> for i in files_destino:
...     subprocess.call(["cp","-v",i,"/tmp/"])
... 
cp: files 1.pdf: No such file or directory
1
cp: files 2.pdf: No such file or directory
1
files.pdf -> /tmp/files.pdf
0
cp: files 3.pdf: No such file or directory
1

出现这种行为的原因是什么?

由于


以下是建议的输出。

   >>> subprocess.call(["cp","-v",'"'+i+'"',"/tmp/"])
cp: "files 1.pdf": No such file or directory
1
>>> subprocess.call(["cp","-v",'"{}"'.format(i),"/tmp/"])
cp: "files 1.pdf": No such file or directory
1

2 个答案:

答案 0 :(得分:3)

cp: files 1.pdf: No such file or directory

文件files 1.pdf不在当前目录中。它位于您列出的目录./espacio/内。如果files.pdf有效,那只是因为巧合,当前目录中还有一个files.pdf

parent_path = './espacio/'
for file_name in os.listdir(parent_path):
    file_path = os.path.join(parent_path, file_name)
    subprocess.call(["cp", "-v", file_path ,"/tmp/"])

然而,正如@Colonel Thirty Two评论的那样,在Python中进行复制通常是一个更好的主意,而不是在可以的时候使用shell命令。

答案 1 :(得分:0)

使用您的解决方案@bobince现在可以按照MD5的要求进行操作。

def onepath(archivo):
    logging.basicConfig(filename=salida,filemode="w", format='%(message)s', level=logging.DEBUG)
    for file_name in os.listdir(archivo):
            #se obtiene la ruta relativa de todos los archivos que estan dentro de esa carpeta
            file_path = os.path.join(archivo, file_name)
            print file_path
            with open(file_path) as checkfile:
                    logging.info("MD5" + "(%s) = " % file_name + hashlib.md5(checkfile.read()).hexdigest())