аналог os.walk в PyQt

Прежде чем я смогу продолжить реализацию рекурсивного поиска каталогов/файлов с некоторой фильтрацией для некоторых задач, я хочу знать, есть ли в Qt/PyQt аналог os.walk.

Основное приложение — это приложение с графическим интерфейсом в PyQt4, и все текстовые поля в QStrings и объекты пути (файлы, каталоги) используют QFile, QDir, QFileinfo для манипуляций.

В качестве аналога я имею в виду быстрый и удобный инструмент рекурсивного обхода fs-дерева.

Должен ли я использовать os.walk или что-то более быстрое и информативное?

PS. Возможно, это поможет мне, но я не уверен, что это более эффективно, чем os.walk.


person Крайст    schedule 24.02.2014    source источник
comment
Вы также можете попробовать scandir.   -  person Janne Karila    schedule 24.02.2014
comment
@JanneKarila: боюсь, что еще одна зависимость не подходит для этой задачи. Но все равно спасибо. Добавил в закладки до лучших времен )   -  person Крайст    schedule 24.02.2014


Ответы (1)


Должен ли я использовать os.walk или что-то более быстрое и информативное?

Его нет, и я бы рекомендовал использовать os.walk в python, если вы можете. Это настолько хорошо, насколько это возможно.

Дело не только в том, что в Qt нет такого удобного метода, но даже если вы напишете свой собственный механизм на основе QDir, у вас будет доступ ко всем трем переменным без ручной обработки, как с os.walk.

Если вы отчаянно нуждаетесь в использовании Qt, то у вас может быть следующая функция перемещения ниже, которую я использовал сам некоторое время назад.

main.cpp

#include <QDir>
#include <QFileInfoList>
#include <QDebug>

void traverse( const QString& dirname )
{
    QDir dir(dirname);
    dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoSymLinks | QDir::NoDot | QDir::NoDotDot);

    foreach (QFileInfo fileInfo, dir.entryInfoList()) {
      if (fileInfo.isDir() && fileInfo.isReadable())
          traverse(fileInfo.absoluteFilePath());
      else
          qDebug() << fileInfo.absoluteFilePath();
    }
}

int main()
{
    traverse("/usr/lib");
    return 0;
}

или просто следующее для больших каталогов и в целом, так как оно лучше и удобнее масштабируется:

#include <QDirIterator>
#include <QDebug>

int main()
{
    QDirIterator it("/etc", QDirIterator::Subdirectories);
    while (it.hasNext())
        qDebug() << it.next();
    return 0;
}

main.pro

TEMPLATE = app
TARGET = qdir-traverse
QT = core
SOURCES += main.cpp

Построить и запустить

qmake && make && ./qdir-traverse

Затем вы распечатаете все пройденные файлы. Затем вы можете начать настраивать его в соответствии с вашими потребностями.

person lpapp    schedule 24.02.2014
comment
Спасибо за четкий и подробный ответ. Теперь инструмент выбран и все сомнения ушли. - person Крайст; 24.02.2014
comment
Это можно сделать намного эффективнее с помощью QDirIterator. Однако не знаю, превзойдет ли он os.walk. - person ekhumoro; 24.02.2014
comment
@ekhumoro: абсолютно, и я действительно писал это. Прежний код относится к временам, предшествующим qdiriterator. - person lpapp; 24.02.2014
comment
@Laszlo: Теперь я в замешательстве :( Но я сравню оба метода по скорости и вариантам использования. Все равно спасибо! :) Ваша помощь дала моему мозгу отличную задачу для работы! - person Крайст; 24.02.2014
comment
@Крайст: почему так? Я бы использовал os.walk, но я предоставил альтернативы, если вы действительно хотите использовать Qt. Я имею в виду, что люди обычно используют os.walk вместе с тремя переменными. Если вам это не нужно из os.walk, просто перечислите каталоги, решения qt работают, в противном случае вам нужно вручную создать три переменные, поэтому это зависит от вашего варианта использования, но у меня было предположение, что вам понадобится тоже три переменные. В этом смысле нет ничего похожего на QDir::traverse или QDir::walk. :) Я бы не стал сильно беспокоиться о производительности, потому что, если бы вы это сделали, вы бы не использовали python. ;-) - person lpapp; 24.02.2014
comment
@LaszloPapp: я бы не стал сильно беспокоиться о производительности, потому что если бы вы это сделали, вы бы не использовали python. ;-) — здорово, здорово, здорово!! Отличная цитата на все времена! :) пс. Думаю, что тему можно закрыть. - person Крайст; 24.02.2014