python subprocess.call[]可以';不能对带有空格的文件执行操作

python subprocess.call[]可以';不能对带有空格的文件执行操作,python,for-loop,space,cp,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 fil

我在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
文件
files 1.pdf
不在当前目录中。它在您列出的目录中,
/espacio/
。如果
files.pdf
起作用,那只是因为碰巧currect目录中还有一个
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/"])
然而,正如@collone three Two所评论的,通常最好在Python内部进行复制,而不是在可能的情况下使用shell命令

文件
files 1.pdf
不在当前目录中。它在您列出的目录中,
/espacio/
。如果
files.pdf
起作用,那只是因为碰巧currect目录中还有一个
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/"])
然而,正如@collone three Two所评论的,通常最好在Python内部进行复制,而不是在可能的情况下使用shell命令

文件
files 1.pdf
不在当前目录中。它在您列出的目录中,
/espacio/
。如果
files.pdf
起作用,那只是因为碰巧currect目录中还有一个
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/"])
然而,正如@collone three Two所评论的,通常最好在Python内部进行复制,而不是在可能的情况下使用shell命令

文件
files 1.pdf
不在当前目录中。它在您列出的目录中,
/espacio/
。如果
files.pdf
起作用,那只是因为碰巧currect目录中还有一个
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/"])

然而,正如@collone three Two所评论的那样,通常最好在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())

使用您的解决方案@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())

使用您的解决方案@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())

使用您的解决方案@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())


你试过在文件名周围加引号吗<代码>'“'+i+'”更好的是,使用works for me。你使用哪种操作系统?这让我有点吃惊。
cp
是别名吗?我想知道传递变量是否是导致空间膨胀的原因。如果您使用
/bin/cp
而不是
cp
,它是否能按预期工作?Mac Os X 10.10、Python 2.7.6是否尝试在文件名周围添加引号<代码>'“'+i+'”更好的是,使用works for me。你使用哪种操作系统?这让我有点吃惊。
cp
是别名吗?我想知道传递变量是否是导致空间膨胀的原因。如果您使用
/bin/cp
而不是
cp
,它是否能按预期工作?Mac Os X 10.10、Python 2.7.6是否尝试在文件名周围添加引号<代码>'“'+i+'”更好的是,使用works for me。你使用哪种操作系统?这让我有点吃惊。
cp
是别名吗?我想知道传递变量是否是导致空间膨胀的原因。如果您使用
/bin/cp
而不是
cp
,它是否能按预期工作?Mac Os X 10.10、Python 2.7.6是否尝试在文件名周围添加引号<代码>'“'+i+'”更好的是,使用works for me。你使用哪种操作系统?这让我有点吃惊。
cp
是别名吗?我想知道传递变量是否是导致空间膨胀的原因。如果您使用
/bin/cp
而不是
cp
它是否能按预期工作?Mac Os X 10.10、Python 2.7.6如果使用“cp”而不是“rsync”命令或“md5”命令,该怎么办?@x1c70r:您也可以这样做:只需对文件路径进行路径设置,例如
espacio/files 1.pdf
,不仅仅是文件名,例如
files 1.pdf
,你会没事的。@x1c70r首先,不要编辑答案来响应它。第二,答案是“可以的时候”。Python包含一个模块,并且有第三方模块用于
rsync
,不过如果您愿意,您当然可以调用命令行版本。了解std库、使用和谷歌搜索所有内容。要计算MD5哈希,请使用
import hashlib
hashlib.MD5(open(filename,'rb').read()).hexdigest()
。Rsync没有内置到标准库中,所以为了避免使用命令行,您必须使用第三方模块。谢谢大家!让我想想。如果我想用“rsync”命令或“md5”命令来代替“cp”呢?@x1c70r:你做同样的事情:只需路径文件路径,例如
espacio/files 1.pdf
,而不仅仅是文件名,例如
files 1.pdf
,你会没事的。@x1c70r首先,不要编辑答案来响应它。第二,答案是“可以的时候”。Python包含一个模块,并且有第三方模块用于
rsync
,不过如果您愿意,您当然可以调用命令行版本。了解std库、使用和谷歌搜索所有内容。要计算MD5哈希,请使用
import hashlib
hashlib.MD5(open(filename,'rb').read()).hexdigest()
。Rsync没有内置到标准库中,所以为了避免使用命令行,您必须使用第三方模块。谢谢大家!让我想想。如果我想用“rsync”命令或“md5”命令来代替“cp”呢?@x1c70r:你做同样的事情:只需路径文件路径,例如
espacio/files 1.pdf
,而不仅仅是文件名,例如
files 1.pdf
,你会没事的。@x1c70r首先,不要编辑答案来响应它。第二,answe