Python считывает большое количество файлов в каталоге и обрабатывает быстрым способом?

#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. Он нигде не выполняет поиск. Если вы хотите получить доступ ко всем файлам, то это самый быстрый способ.

5. docs.python.org/3/library/os.html#os.scandir

Ответ №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?