如何在原始模式下访问sys.argv(或任何字符串变量)?

时间:2009-12-06 14:05:46

标签: python string-literals

我在解析作为参数发送的文件路径时遇到了困难:

如果我输入:

os.path.normpath('D:\Data2\090925')

我得到了

'D:\\Data2\x0090925'

显然文件夹名称中的\ 0正在扰乱格式化。我可以通过以下方式纠正它:

os.path.normpath(r'D:\Data2\090925')

给出了

'D:\\Data2\\090925'

我的问题是,如何使用sys.argv实现相同的结果?即:

os.path.normpath(sys.argv[1])

我找不到一种方法,可以将原始模式下的sys.argv提供给os.path.normpath(),以避免文件夹从零开始出现问题!

另外,我知道我可以用python script.py D:/Data2/090925来提供脚本,它会完美运行,但不幸的是Windows系统固执地为我提供了'\',而不是'/',所以我真的需要解决这个问题,而不是避免它。

UPDATE1 补充: 如果我使用脚本test.py:

import os, sys 
if __name__ == '__main__': 
    print 'arg 1: ',sys.argv[1] 
    print 'arg 1 (normpath): ',os.path.normpath(sys.argv[1]) 
    print 'os.path.dirname :', os.path.dirname(os.path.normpath(sys.argv[1])) 

我得到以下内容:

C:\Python>python test.py D:\Data2\091002\ 
arg 1: D:\Data2\091002\ 
arg 1 (normpath): D:\Data2\091002 
os.path.dirname : D:\Data2 

即:我失去了091002 ......

UPDATE2 :正如下面的评论告诉我的那样,问题解决了我删除normpath时给出的示例:

import os, sys 
if __name__ == '__main__': 
    print 'arg 1: ',sys.argv[1] 
    print 'os.path.dirname :', os.path.dirname(sys.argv[1])
    print 'os.path.split(sys.argv[1])):', os.path.split(sys.argv[1])

给出了:

 C:\Python>python test.py D:\Data2\091002\ 
arg 1: D:\Data2\091002\ 
os.path.dirname : D:\Data2\091002
os.path.split : ('D:\\Data2\\090925', '')

如果我使用D:\ Data2 \ 091002:

 C:\Python>python test.py D:\Data2\091002
arg 1: D:\Data2\091002 
os.path.dirname : D:\Data2
os.path.split : ('D:\\Data2', '090925')

我可以使用哪种方式:谢谢!

2 个答案:

答案 0 :(得分:5)

“丢失”路径的最后一部分与sys.argv中的转义(或缺少)无关。

如果您使用os.path.normpath()然后使用os.path.dirname(),那么这是预期的行为。

>>> import os
>>> os.path.normpath("c:/foo/bar/")
'c:\\foo\\bar'
>>> os.path.dirname('c:\\foo\\bar')
'c:\\foo'

答案 1 :(得分:0)

以下是一段Python代码,用于在目录路径的末尾添加反斜杠:

def add_path_slash(s_path):
    if not s_path:
        return s_path
    if 2 == len(s_path) and ':' == s_path[1]:
        return s_path  # it is just a drive letter
    if s_path[-1] in ('/', '\\'):
        return s_path
    return s_path + '\\'