【问题标题】:os.walk analogue in PyQtPyQt 中的 os.walk 模拟
【发布时间】:2014-02-24 07:04:55
【问题描述】:

在我可以继续执行递归目录/文件搜索并对某些任务进行一些过滤之前,我想知道 Qt/PyQt 是否具有 os.walk 的类似物。

主应用是 PyQt4 中的 GUI 应用,QStrings 和路径对象(文件、目录)中的所有文本字段都使用 QFileQDirQFileinfo 进行操作。

作为类比,我的意思是快速方便的递归 fs-tree 遍历工具。

我应该使用os.walk 还是更快、信息量更大的东西?

PS。也许this 可以帮助我,但我不确定这是否比os.walk 更有效。

【问题讨论】:

  • 你也可以试试scandir
  • @JanneKarila:恐怕另一个依赖项不适合该任务。不过还是谢谢你。添加到书签,直到好时光到来)

标签: python qt pyqt qtcore qfile


【解决方案1】:

我应该使用 os.walk 还是更快、信息量更大的东西?

没有,如果可以的话,我建议在 python 中使用os.walk。它和它一样好。

这不仅是因为 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

然后,您将打印所有遍历的文件。您可以开始对其进行自定义,然后进一步满足您的需求。

【讨论】:

  • 感谢您清晰详细的回答。现在该工具被选中,所有疑虑都消失了。
  • 这可以通过QDirIterator 更有效地完成。不过,不知道它是否会胜过os.walk
  • @ekhumoro:当然,我实际上是在写那个。前一个代码来自 pre-qdiriterator 时代。
  • @Laszlo:现在我很困惑 :( 但我会比较这两种方法的速度和用例。无论如何,谢谢!:) 你的帮助让我的大脑完成了一项伟大的任务!跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 2015-03-11
  • 2016-03-19
相关资源
最近更新 更多