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