2011-05-18 36 views
2

我在Windows XP上的Python 2.7中有一个讨厌的问题。我有一些代码从argparse库的命令行中收集文件名。然后我尝试打开这个文件。通常情况下,这可以正常工作,如果您传入完整路径名称,它也会成功打开。但是,如果路径使用的驱动器号不是从您开始的位置,则python会失败,并显示IO错误,指出该文件或目录不存在。在python中的独立驱动器上打开文件

例如:

C:\>schema_split.py "C:\path\to\file" 
works! 
C:\>schema_split.py "I:\path\to\file" 
fails! 

相关代码段:

parser = argparse.ArgumentParser(description='Process the Accounting file.', version='%(prog)s 1.1') 
parser.add_argument('infile', nargs="+", type=str, help='list of input files') 
# get the current arguments and put them into a variable 
args = parser.parse_args() 
for f in args.infile: 
    with open(f, "rb") as mycsv: 

我不知道为什么会蟒蛇有备用驱动器号的问题。我唯一能想到的就是我们在映射到本地驱动器的共享驱动器上运行它。但是对于所有意图和目的,程序不应该“看到”它在远程驱动器上运行的事实。

想法?

+0

有关命令行和argparse的详细信息对于您的问题是多余的。 – 2011-05-18 14:11:44

+0

“f”总是一个有效的文件名? – 2011-05-18 14:14:13

+0

@Ignacio Vazquez-Abrams对测试用例失败了,是的。我想我可以通过将当前工作目录切换到I:来“修复”它,但这并不能解释为什么会发生这种情况。 – 2011-05-18 14:17:24

回答

1

你假设python有驱动器号的问题。事实并非如此。你的问题是别的。

C:\>python 
Python 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> f = open(r"U:\foo.txt") 
>>> 

正如你可以看到从另一个驱动器使用反斜杠打开文件没有错误。

使用下面的脚本来诊断问题:

import os 
import sys 

path = sys.argv[1] 
basepath, fname = os.path.split(path) 
print "directory:", basepath 
if os.path.exists(basepath): 
    print "directory exists" 
else: 
    print "directory does not exist!" 
    sys.exit() 

if not fname: 
    print "no filename provided!" 
    sys.exit() 
print "filename:", fname 
if os.path.exists(path): 
    print "filename exists" 
else: 
    print "filename not found!" 
    print "directory contents:" 
    for fn in os.listdir(basepath): 
     print fn 

通过你的脚本路径,并且它将测试您传递给它的路径和文件名。

+0

Drat,你的权利。它必须尽快失败。那么,回到制图板 – 2011-05-18 14:53:33

1

我想你可能想尝试两个斜杠而不是1.另外我认为this SO Question可能对你有帮助。

两条斜线这样C:\>schema_split.py "I:\\path\to\file"

希望这是有帮助的。

+0

命令行参数总是被视为原始字符串,除非有意外的事情发生。 – 2011-05-18 14:19:46

+0

@ IgnacioVazquez-Abrams:我在看另一个帖子上的干净路径有两个斜线。由于斯宾塞没有使用任何清洁工具,我试图让路径看起来很干净,就像我链接到的其他问题一样。所以你说这没关系是正确的? – wilbbe01 2011-05-18 14:35:18

+0

另一篇文章显示了字符串的表示形式,它将使用两个反斜杠来显示其中的一个。 – 2011-05-18 14:36:38

2

您可以使用os.path.normpath来规范路径,并检查路径是否有效。

+1

normath - > normpath – XTL 2013-04-15 12:25:51

+0

@XTL:更正,谢谢 – 2013-04-15 12:50:16

相关问题