我的脚本执行以下操作:
./myscript pathfile.txt
浏览路径时如下所示:
/mnt/filesystem/Windows/somefile.exe
/mnt/filesystem/Program Files/somefile.exe
提取的路径如下所示:
C:\windows\somefile.exe
C:\program Files\somefile.exe
然后我尝试将pathfile.txt中的路径转换为适合我的系统路径,以便我可以从/mnt/filesystem/
复制出.exe文件。
从行中删除3个第一个字符,删除C:。
现在路径如下:
/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
答案 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 module和python 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()
(未经测试)