Python Ошибка FileNotFound, вызванная Python вставкой нежелательных слешей в строку - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь сохранить фигуру из Matplotlib в папку на диске и получаю нежелательное поведение из пути к файлу.

Это то, что я настроил для работы с реальным строковым типом для обработки escape-символа "\".

save_path = r"\\nemesis\Network Planning\Team Members\Taylor\2020_04_23 - COVID Impact 
Adjustment\Test Stores\State and Region Growth - " +str(Store_ID)+ ".jpg"
print(save_path)
plt.savefig(save_path)

В операторе печати отображается правильная строка пути к файлу

Однако при запуске savefig python появляется для добавления дополнительного sla sh рядом с каждым существующим sla sh в строке и выдает ошибку FileNotFound. Ниже приведена полная расшифровка ошибки.

FileNotFoundError: [Errno 2] Нет такого файла или каталога: '\\\\ nemesis \\ Network Planning \\ Участники группы \\ Taylor \\ 2020_04_23 - Корректировка воздействия COVID \\ Test Магазины \\ State and Region Growth - 17062.jpg '

Я в растерянности из-за причин, по которым это происходит, и перепробовал множество различных строковых методов, но ни один из них не работал.

Любая помощь очень ценится

1 Ответ

0 голосов
/ 23 апреля 2020

Чтобы ответить на ваш вопрос, мне нужно объяснить некоторые предпосылки необработанных строк. Необработанные строки - это просто более простой способ включить обратную косую черту в обычную строку без необходимости экранировать их. Например, определяя строку, которая будет напечатана как «a \ b \ c» с использованием обычного строкового синтаксиса, вам нужно будет написать my_string = "a\\b\\c", но с необработанными строками вам нужно только написать r «a \ b \» c ", но результирующая строка одинакова в обоих случаях:

s = r"a\b\c"
s2 = "a\\b\\c"
s == s2 # Evaluates to True

При печати строки print () исключает дополнительные обратные слэши, необходимые для воссоздания строки с использованием обычного синтаксиса:

print(s) # -> a\b\c

Чтобы просмотреть представление строки, подходящей для ее воссоздания, используйте repr(s):

print(repr(s)) # -> "a\\b\\c"

Теперь для вашего вопроса. Необработанная строка, которую вы создаете, может выглядеть так, как вы хотите, когда используете print (), так как она исключает лишние косые черты, но это не то, что вам нужно. Во-первых, я не думаю, что вы хотели иметь две обратные косые черты в начале пути.

save_path = r"\\nemesis\Network Planning\..."
print(save_path) # Prints the correct path, save the extra leading backslash
print(repr(save_path)) # Reveals the normal string representation, which requires 4 backslashes to create (where there should be only two).

Исправить эту проблему просто: представьте путь к файлу по-другому. Либо используйте обычные строки и экранируйте все обратные косые черты вручную: "\\nemesis\\Network Planning\\Team Members\\Taylor\\2020_04_23 - COVID Impact Adjustment\\Test Stores\\State and Region Growth - " +str(Store_ID)+ ".jpg", либо просто используйте os.path.join("\\nemesis", "Network Planning", "Team Members", "Taylor", "2020_04_23 - COVID Impact Adjustment", "Test Stores", "State and Region Growth - "+ str(Store_ID)+ ".jpg"), чтобы автоматически объединять каталоги со всеми правильными обратными слешами (я не могу проверить эту вторую, потому что я на Linux)

Надеюсь, это помогло!

...