У меня есть следующий код, который печатает нужный мне элемент во всех файлах xml, которые у меня есть в каталоге, я пытаюсь переместить файлы, содержащие элемент «дрон», в другой каталог, но я не могу это сделать, может быть, кто-то может мне помочь с этим ?
import os
import shutil
from xml.etree import ElementTree as ET
# files are in a sub folder where this script is being ran
path = "D:\\TomProject\\Done"
for filename in os.listdir(path):
# Only get xml files
if not filename.endswith('.xml'): continue
# I haven't been able to get it to work by just saying 'if filename.endswith('.xml')' only
if not..
fullname = os.path.join(path, filename)
# This joins the path for each file it files so that python knows the full path / filename
to trigger parser
tree = ET.parse(fullname)
# Parse the files..
print(filename)
# Get the root of the XML tree structure
root = tree.getroot()
# Print the tags it finds from all the child elements from root
for object in root.findall('object'):
rank = object.find('name').text
print(rank)
name = 'drone'
if rank == 'Drone':
shutil.move("D:\\TomProject\\Images", "D:\\TomProject\\Done")
Текущий код, похоже, вызывает Shutil.move с двумя жестко запрограммированными путями, но вместо этого вы должны передавать полный путь (fullname
в вашем коде) в качестве аргумента src
.
Я рекомендую использовать pathlib вместо os.path
функций.
import shutil
from pathlib import Path
from xml.etree import ElementTree as ET
def contains_drone(path):
tree = ET.parse(path.as_posix())
root = tree.getroot()
for obj in root.findall('object'):
rank = obj.find('name').text
if rank == 'Drone':
return True
return False
def move_drone_files(src, dst):
src, dst = Path(src), Path(dst)
for path in src.iterdir():
if path.suffix == '.xml' and contains_drone(path):
print(f'Moving {path.as_posix()} to {dst.as_posix()}')
shutil.move(path, dst)
Использование, предполагая, что каталог Images
— это место, где находятся файлы, а каталог Done
— это место, куда вы хотите их переместить:
move_drone_files('D:\\TomProject\\Images', 'D:\\TomProject\\Done')
просто чтобы было ясно, код, который вы только что опубликовали, должен заменить тот, который у меня есть?
Да; логика для определения того, содержит ли файл drone
, была выделена в отдельную функцию, чтобы упростить обработку этой части логики. Петля src.iterdir()
эквивалентна петле os.listdir(...)
.
Большое спасибо, но я не могу найти, где мне нужно указать путь к моей директории.
В последней строке моего ответа приведен пример того, как вы бы это назвали - если пути в моем примере неверны, вы должны заменить их фактическими.
пути правильные, но когда я ввожу пути, он говорит "недопустимый параметр"
Для проверки я создал каталог с подкаталогами Images
и Done
. В изображениях у меня было 3 файла — foo.txt
, bar.xml
, содержащий совпадение, и baz.xml
, содержащий другое имя. Я начал интерактивный сеанс ipython
и вставил код из ответа. Затем я позвонил move_drone_files
с двумя тестовыми путями, и это сработало, как и ожидалось. Мне нужно больше контекста для того, как/почему в конечном итоге будет сказано invalid parameter
, чтобы что-то предложить. Вы используете как минимум Python 3.7 или выше?
у меня есть python 3.7 или выше, проблема, которая у меня есть сейчас, заключается в том, что когда я копирую путь, как вы сказали, у меня есть красная линия под двумя путями и окрашена в серый цвет.
Наконец-то я получил код, работающий отлично, большое спасибо!
У меня есть еще один вопрос к вам, теперь, когда он перемещает файл xml, я хотел бы переместить другой файл txt и jpeg с точным именем, что и файл xml, как я могу это сделать?
Я бы предложил попробовать применить то, что вы видели здесь, к этому случаю, и если вы все еще не можете понять это, то это должен быть отдельный вопрос.
"но я не могу это сделать" - В чем именно проблема?