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

python subprocess.call[] can't do operations over files with spaces

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

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

我已经在列表中分配了所有内容:

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

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

   >>> 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
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 三十二评论的那样,在 Python 内进行复制通常比尽可能使用 shell 命令更好。

有了你的解决方案@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())