根据文件路径复制文件

时间:2014-02-20 15:42:19

标签: python subprocess

我的脚本执行以下操作:

./myscript pathfile.txt
  • 将包含文件系统的映像文件挂载到/ mnt / filesystem /.

浏览路径时如下所示:

/mnt/filesystem/Windows/somefile.exe
/mnt/filesystem/Program Files/somefile.exe
  • 搜索pathfile.txt并从文件中提取所有路径。

提取的路径如下所示:

C:\windows\somefile.exe
C:\program Files\somefile.exe
  • 然后我尝试将pathfile.txt中的路径转换为适合我的系统路径,以便我可以从/mnt/filesystem/复制出.exe文件。

  • 从行中删除3个第一个字符,删除C:。

  • 在\上使用replace,将其设置为/.
  • 添加装载目的地。

现在路径如下:

/mnt/filesystem/windows/somefile.exe
/mnt/filesystem/program files/somefile.exe

我试图使用路径名复制文件,但由于路径间距,大写/小写等原因,它无法正常工作。

所以我的问题:

当涉及到大写/小写,间距等时,我如何动态适应路径差异?

我现在正尝试使用/mnt/filesystem/program files/somefile.exe复制真正位于/mnt/filesystem/"Program Files"/somefile.exe的{​​{1}}。

我是编程新手,所以请给我一些非常简单的例子。谢谢

更新:

我用我的大脚本制作了一个较小的脚本,根据你输入的塞巴斯蒂安做了一些我能理解的东西,现在我有了下面的代码。但是,代码似乎不起作用。脚本正在运行,但没有复制文件。

subprocess.call

2 个答案:

答案 0 :(得分:0)

我建议在python中使用内置的os模块,而不是手动获取这些路径并尝试确定如何处理大小写项。这样操作系统实际上会告诉您位置。以下是获取当前工作目录,Program Files目录以及相关的绝对和相对引用的示例。

>>> import os
>>> print os.getcwd()
C:\Users\sheindel
>>> print os.environ["ProgramFiles"]
C:\Program Files
>>> print os.path.abspath(os.environ["ProgramFiles"])
C:\Program Files
>>> print os.path.relpath(os.environ["ProgramFiles"])
..\..\Program Files

请记住,如果它是64位计算机,您将拥有两个不同的程序目录。上面的示例将在32位系统上获取Program Files目录,它将在64位系统上获得64位Program Files目录。如果在64位系统上,以下代码将获得32位程序文件

>>> print os.getcwd()
C:\Users\sheindel
>>> print os.environ["ProgramFiles(x86)"]
C:\Program Files (x86)
>>> print os.path.relpath(os.environ["ProgramFiles(x86)"])
..\..\Program Files (x86)
>>> print os.path.abspath(os.environ["ProgramFiles(x86)"])
C:\Program Files (x86)

花一些时间阅读python docs on the os modulepython docs on the os.path module专门针对os.path

答案 1 :(得分:0)

要在具有区分大小写的文件系统的系统上复制原始不区分大小写的Windows路径,您可以依赖Windows禁止用户创建第二个文件,只有在允许使用规范化大小写来创建映射:

"path from pathfile.txt" -> "mounted path on case-sensitive filesystem"

即使在Unix上也可以使用ntpath模块来操作Windows路径,例如:

>>> import ntpath
>>> ntpath.splitdrive('C:\windows\somefile.exe')
('C:', '\\windows\\somefile.exe')
>>> ntpath.normcase('C:\program Files/somefile.exe')
'c:\\program files\\somefile.exe'

如果正确使用subprocess.call(),路径中的空格应该没有任何问题。虽然您不需要subprocess.call()来复制文件;您可以使用shutil.copy()代替:

#!/usr/bin/env python
import ntpath
import os
import shutil
import sys

def normalize(path):
    path = path.strip()
    path = ntpath.splitdrive(path)[1].lstrip("\\/") # remove C:\ or C:/
    return path.replace("\\", "/").lower()

# get non-blank lines and normalize paths
with open(sys.argv[1]) as pathfile:
    paths = set(filter(bool, map(normalize, pathfile)))

# find the paths in the source directory tree & copy them to the destination 
src_dir = "/mnt/filesystem/"        # where to copy from
assert src_dir.endswith(os.path.sep) # needed for `path[len(src_dir):]` below
dest_dir = "/destination/directory" # where to copy to
for root, dirs, files in os.walk(src_dir): # traverse directory tree
    for filename in files:
        path = os.path.join(root, filename)
        normalized_path = path[len(src_dir):].lower()
        if normalized_path in paths: # path is from pathfile.txt
           shutil.copy(path, dest_dir) # copy
           paths.remove(normalized_path)
           if not paths: # no more paths to copy
              sys.exit()

(未经测试)