2014-12-10 1 views
0

Я новичок в python и имею следующую проблему. Если я раскомментировать последнюю строчку этого кода:Объект не имеет ошибки атрибута при использовании ElementTree

# traverse all directories 
for root, dirs, files in os.walk(args.rootfolder): 
    for file in files: 
     print('Current file name: ' + file) 
     if file.endswith('.savx'): 
      # read single xml savx file 
      currfilename = os.path.join(root,file) 
      print('Current full file name: ' + currfilename) 
      tree = ET.parse(currfilename) 
      # root = tree.getroot() <-- if I uncomment this line I get errors 

Я получаю эту ошибку:

Traceback (most recent call last): 
    File "convert.py", line 30, in <module> 
    currfilename = os.path.join(root,file) 
    File "C:\progs\develop\Python34\lib\ntpath.py", line 108, in join 
    result_drive, result_path = splitdrive(path) 
    File "C:\progs\develop\Python34\lib\ntpath.py", line 161, in splitdrive 
    normp = p.replace(_get_altsep(p), sep) 
AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'replace' 

Похоже, ошибка появляется после того, как второй file in files итерации цикла.

ответ

2

Вы использовали root дважды в вашем коде, для различных вещей:

for root, dirs, files in os.walk(args.rootfolder): 
# ^^^^ 

и

root = tree.getroot() 

Так что, когда вы пытаетесь использовать root как строку пути при создании следующего файла для загрузки:

currfilename = os.path.join(root,file) 

Вы найдете, что вы заменили root вместо этого указывается имя пути с помощью объекта ElementTree.

Используйте другое имя для имени корневого каталога или вашего объекта ElementTree. Использовать dirname, например:

for dirname, dirs, files in os.walk(args.rootfolder): 
    for file in files: 
     print('Current file name: ' + file) 
     if file.endswith('.savx'): 
      # read single xml savx file 
      currfilename = os.path.join(dirname, file) 
      print('Current full file name: ' + currfilename) 
      tree = ET.parse(currfilename) 
      root = tree.getroot()