2011-05-18 34 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

相關問題