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())
我在 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())