Открыть файл на отдельном диске в Python - PullRequest
2 голосов
/ 18 мая 2011

У меня раздражающая проблема в python 2.7 на Windows XP.У меня есть некоторый код, который собирает имя файла из командной строки с библиотекой argparse.Затем я пытаюсь открыть указанный файл.Обычно это работает нормально, и если вы передаете полный путь, он тоже успешно его открывает.Однако, если путь использует букву диска, отличную от той, с которой вы начали, 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:

Я не знаю, почему у python возникают проблемы с альтернативными буквами дисков.Единственное, что я могу придумать, - это запустить его на общем диске, сопоставленном с локальным.Но, по сути, программа не должна «видеть» тот факт, что она работает на удаленном диске.

Мысли?

Ответы [ 3 ]

2 голосов
/ 18 мая 2011

Вы можете использовать os.path.normpath для нормализации пути и, возможно, проверки правильности пути.

2 голосов
/ 18 мая 2011

Вы предполагаете, что у 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

Передайте путь к сценарию, и он проверит путь и имя файла, который вы передаете ему.

2 голосов
/ 18 мая 2011

Я думаю, что вы можете попробовать две косые черты вместо 1. Также я думаю, этот вопрос SO может быть вам полезен.

Две такие косые черты C:\>schema_split.py "I:\\path\to\file"

Надеюсь, это полезно.

...