Почему мой скрипт не может проанализировать XML-файл в подкаталоге? - PullRequest
0 голосов
/ 17 июня 2019

Когда я пытаюсь проанализировать XML-файл в подкаталоге, я получаю FileNotFoundError.Когда я помещаю файл рядом со сценарием, он может разобрать его нормально.Но почему?

#!/usr/bin/env python3
import os
import xml.etree.ElementTree as ET

script_path = os.path.dirname(os.path.realpath(__file__))

path_to_file = os.path.join(script_path, '/test', 'file.xml')

# works
tree = ET.parse('file.xml')

# Throws file not found error
tree = ET.parse(path_to_file)

Ответы [ 3 ]

2 голосов
/ 17 июня 2019

Попробуйте самый простой способ отладки, напечатав значение path_to_file.

os.path.join() используется, поэтому вам не нужно указывать (ос-специфический) символ разделителя пути для пути, который он создает, что означает, что вам не нужно (не нужно) указывать их.

Вы переопределите разделитель пути в части test - измените:

path_to_file = os.path.join(script_path, '/test', 'file.xml')

до

path_to_file = os.path.join(script_path, 'test', 'file.xml')
1 голос
/ 17 июня 2019

Попробуйте написать '/test' без косой черты.

path_to_file = os.path.join(script_path, 'test', 'file.xml')
0 голосов
/ 17 июня 2019

Я отправляю ответ сам, потому что, хотя ответы решают проблему, они не дают правильной причины, почему их код работает, а мой нет.

Существенная проблема с моим кодом состоит в том, что строка

path_to_file = os.path.join(script_path, '/test', 'file.xml')
# Expected value of path_to_file:
# /path/to/script/test/file.xml

# Output of print(path_to_file):
# /test/file.xml

содержит абсолютный путь /test вместо относительного пути ./test или, как указывалось ранее, лучший способ test. В результате с /test результирующий путь не будет содержать содержимое script_path.

Предыдущие ответы могут помочь в случаях, когда вы переходите на один каталог ниже, но не охватывают такие случаи, как

path_to_file = os.path.join(script_path, 'test/subdir', 'file.xml')

Где вы можете найти / полезным. Я думаю, что можно доверять os.path.join(), чтобы заботиться о тех каталогах, специфичных для платформы. Пожалуйста, дайте мне знать, если вы не согласны со мной в этом.

...