#python #list #directory
#python #Список #каталог
Вопрос:
У меня более 5000 XML-файлов в каталоге. Я планирую читать их один за другим и анализировать, однако я не уверен, что os.listdir (path) — хороший способ,
import xml.etree.ElementTree as ET
import os
list_files = os.listir(os.curdir)
for files in list_files:
tree = ET.parse(files)
root = tree.getroot()
os.listdir(путь) возвращает список с именами файлов внутри этого каталога. После этого цикл for, который принимает строковые имена файлов и передает их объекту класса синтаксического анализатора, может оказаться не лучшим способом, поскольку анализатор будет искать файлы снова, во второй раз, с их именами внутри того же каталога.
Есть ли способ лучше? Я что-то упускаю, может быть, логику указателя для поиска внутри каталога?
РЕДАКТИРОВАТЬ: Я думаю, что этот вопрос не по теме и его следует удалить, поскольку анализатор не выполняет поиск по имени строки внутри каталога, другими словами, я считаю, что операционная система обрабатывает его сзади. Как вы можете, следуя строкам внутри объекта ET синтаксического анализатора, он открывается напрямую
def parse(self, source, parser=None):
close_source = False
if not hasattr(source, "read"):
source = open(source, "rb")
close_source = True
Комментарии:
1. Возможно, вы могли бы пояснить, что вы ищете. В вашем примере анализируется каждый файл (в первом приближении), но вы, похоже, хотите найти конкретный файл. Вы хотите встроить индекс? без этого сканирование всех файлов кажется единственным способом.
2. Я хочу проанализировать их все, но после того, как вы перечисляете и выполняете цикл for для списка, он берет строку из списка и выполняет поиск в более чем 5000 файловых каталогах во второй раз, я считаю, что это дорого
3. как еще вы предлагаете анализировать каждый файл, если вы не выполняете итерацию по списку
4. Это не так —
for files in list_files
перебирает строки пути, поэтому он напрямую переходит к этому файлу, анализирует его и начинает читать XML. Он нигде не выполняет поиск. Если вы хотите получить доступ ко всем файлам, то это самый быстрый способ.
Ответ №1:
Вы можете предпринять несколько шагов для чтения XML-файлов:
Шаг 1: Проанализируйте все XML-файлы текущего каталога в виде списка
import xml.etree.ElementTree as ET
import os
items = os.listdir(".")
xmllist = []
for names in items:
if names.endswith(".xml"):
xmllist.append(names)
print(xmllist)
Шаг 2:
Теперь хотите прочитать файлы xmllist
for files in xmllist:
tree = ET.parse(files)
root = tree.getroot()
print(root)
[Примечание: если у вас есть дополнительные запросы, оставьте комментарии]
Комментарии:
1. в чем отличие от кода в моем вопросе
Ответ №2:
Пожалуйста, проверьте этот python3.5 : https://docs.python.org/3/library/os.html#os.scandir python2 : https://pypi.org/project/scandir /
try:
from os import scandir, walk
except ImportError:
from scandir import scandir, walk
def subdirs(path):
for entry in scandir(path):
if entry.name.endswith('.xml') and entry.is_file(): // change your restriction
yield entry.name
for i in subdirs('/tmp'):
print i # you get file name here,
//ET.parse(i)
Комментарии:
1. Я полагаю, вы говорите мне, что scandir возвращает отличный объект path, как я могу указать path анализатору xml?
2. попробуйте: из os импортировать scandir, обойти, кроме ImportError: из scandir импортировать scandir, обойти вложенные каталоги def(path): «»»Выдайте имена каталогов, не начинающиеся с ‘.’ по заданному пути.»»» для записи в scandir(path): if entry.is_file(): yield entry.name для i в subdirs(‘/tmp’): выведите i
3. Как я могу передать объект path анализатору xml?