得到某目录下的某些文件

本文介绍了一个使用Python编写的脚本,该脚本能够遍历指定目录下的所有符合特定模式的文本文件,并从中提取含有AM--标记的数据行进行处理和保存。此脚本利用了正则表达式来匹配和提取所需的信息。
# -*- coding: cp936 -*-
#程序说明
import os
import string
import re
import glob
def save(fileName):
infile=open(fileName,'r')
readline=infile.readlines()
infile.close()
for stro in xrange(len(readline)):
line = readline[stro]
lineTemp = line[line.index("AM--"):]
m = re.search(r'(:([1-9]\d*))', lineTemp)
if m:
print line#print m.group(0), m.group(1)
outfile.write(line)


#for filename in glob.glob('/A/*/low/*.png')
#print filename #输出的是文件的绝对路径
#printer filename.split()[1] 文件名
outfile=open('outfile.txt','w')
for filename in glob.glob('D:\\TestPython\\readTestSpeed\\visitSpeed*.txt'):
save(filename)
outfile.write('\n')
outfile.close()
<think>我们已知用户需要:遍历指定目录下的所有子文件夹,并进一步获取每个文件夹下的特定类型文件(例如某种扩展名的文件)。在Qt中,我们可以使用QDir和QDirIterator来实现这个功能。步骤:1.指定要遍历的根目录。2.使用QDir或QDirIterator递归地获取所有子文件夹。3.对于每个子文件夹,再获取其中特定类型的文件(例如,通过文件后缀名过滤)。注意:Qt5.14支持使用QDirIterator,这是一种高效的方式,可以递归遍历目录。我们将编写一个函数,它接受一个根目录路径和需要过滤的文件后缀名列表(如["*.txt","*.jpg"]),然后返回一个映射:每个文件夹路径对应的文件列表(或者也可能是每个文件夹的绝对路径和该文件夹下符合条件的文件列表)。考虑到性能,如果目录树很大,递归遍历可能会耗时,因此在实际应用中可能需要异步处理或进度反馈。示例代码:我们将使用QDirIterator来遍历根目录下的所有子目录(包括子目录的子目录),然后对每个目录,使用QDir获取该目录下符合后缀名条件的文件列表。注意:QDirIterator::Subdirectories表示递归遍历子目录。代码结构:1.创建一个QDirIterator,设置迭代的根目录,并设置迭代器为递归遍历。2.遍历迭代器,每次遇到一个目录,我们就记录这个目录路径。3.为了避免重复,我们也可以直接在每个目录中查找文件。但是注意,QDirIterator在遍历过程中会返回所有文件目录。我们可以只关注目录,然后在每个目录中查找文件。但更高效的方式是:我们首先获取所有目录,然后分别对每个目录使用QDir获取文件。但是注意:如果目录非常多,可能会影响性能。我们可以考虑在遍历迭代器时,每当遇到一个目录,立即处理该目录下的文件。有两种方法:方法1:先获取所有目录,再分别获取每个目录文件。方法2:在遍历目录的过程中,每当遇到一个目录,就立即处理该目录文件。这里使用方法2,这样只需要遍历一次文件系统,但要注意,QDirIterator在遍历时会返回每个文件项(包括文件目录),我们只处理目录,并且在每个目录中我们只关心特定类型文件?不,这里注意:QDirIterator返回的每个条目,如果是文件,我们不能立即处理,因为我们要的是在它的目录中一起处理?所以实际上我们需要的是每个目录下的文件列表。因此,我们可以这样:-使用QDirIterator遍历,设置过滤器为只遍历目录(QDir::Dirs|QDir::NoDotAndDotDot),然后递归遍历。-遍历每一个目录,使用QDir获取该目录下所有符合条件的文件。然而,这样可能会漏掉根目录(因为根目录本身也是一个目录,但迭代器是从根目录下的子目录开始的)。所以我们需要单独处理根目录,或者将根目录也加入迭代。注意:QDirIterator在设置根目录时,不会返回根目录自身,所以我们需要单独处理根目录。代码步骤:1.创建一个列表(或容器)来存储结果。我们可以使用一个QMap<QString,QStringList>,其中key是目录的绝对路径,value是该目录下所有符合条件的文件文件名或绝对路径)。2.首先处理根目录:获取根目录下符合条件的文件,添加到结果中。3.创建QDirIterator对象,设置根目录,过滤器为只遍历目录(不要点和点点),并且递归。4.在迭代过程中,对每个目录,获取该目录下符合条件的文件,如果非空则添加到结果中。但也可以将根目录添加到迭代的目录列表中,这样就不用单独处理。但QDirIterator默认不返回根目录自身。所以我们需要单独处理。另一种思路:我们可以使用QDir的entryInfoList来递归获取所有目录,但这样需要自己递归。使用QDirIterator更简单。示例代码:我们将编写一个函数,输入为根目录路径和文件后缀过滤列表,输出为每个目录(包括根目录)下符合条件的文件列表。注意:文件过滤列表可以使用QStringList,如:QStringListfilters;filters<< "*.txt"<< "*.jpg";在遍历每个目录时,使用QDir的entryList(filters)可以获取该目录下符合条件的所有文件名。如果需要文件的完整路径,我们可以使用QDir的entryInfoList,然后获取每个QFileInfo的绝对路径。根据需求,我们可能需要文件名或者完整路径。这里我们返回文件的完整路径。代码:假设我们需要获取每个目录下符合条件的文件的完整路径,那么:1.首先处理根目录(注意:根目录也可能没有符合条件的文件)2.然后遍历所有子目录。代码如下(注意:根目录下的文件也需要包括)我们使用QDir::Files|QDir::Readable|QDir::NoSymLinks过滤文件,并且忽略符号链接(根据实际需要调整)。考虑到跨平台,我们避免使用平台特定的符号。使用Qt5.14,代码应兼容Windows、Linux和macOS。以下为示例函数:```cpp#include<QDir>#include<QDirIterator>#include<QFileInfo>#include<QMap>#include<QDebug>//函数:获取指定根目录下所有子目录及其中的特定类型文件//rootDir:根目录路径//filters:文件过滤器,如QStringList()<< "*.txt"<< "*.doc"//返回值:QMap<QString,QStringList>,key为目录绝对路径,value为该目录下所有符合条件的文件的绝对路径QMap<QString,QStringList>findAllFilesInSubdirectories(constQString&rootDir,constQStringList&filters){QMap<QString,QStringList>result;//确保根目录存在QDirroot(rootDir);if(!root.exists()){qWarning()<< "Directorydoesnotexist:"<< rootDir;returnresult;}//处理根目录//获取根目录下的所有符合条件的文件QFileInfoListrootFiles=root.entryInfoList(filters,QDir::Files|QDir::Readable|QDir::NoSymLinks);if(!rootFiles.isEmpty()){QStringListfilePaths;for(constQFileInfo&fileInfo:rootFiles){filePaths.append(fileInfo.absoluteFilePath());}result[root.absolutePath()]=filePaths;}//创建迭代器:只遍历目录(不包括特殊目录.和..),并且递归QDirIteratorit(rootDir,QDir::Dirs|QDir::NoDotAndDotDot|QDir::NoSymLinks,QDirIterator::Subdirectories);while(it.hasNext()){QStringdirPath=it.next();QDirdir(dirPath);//获取当前目录下的文件QFileInfoListfiles=dir.entryInfoList(filters,QDir::Files|QDir::Readable|QDir::NoSymLinks);if(!files.isEmpty()){QStringListfilePaths;for(constQFileInfo&fileInfo:files){filePaths.append(fileInfo.absoluteFilePath());}result[dir.absolutePath()]=filePaths;}}returnresult;}```使用示例:```cppQStringroot="E:/example";QStringListfilters;filters<< "*.txt"<< "*.jpg";QMap<QString,QStringList>allFiles=findAllFilesInSubdirectories(root,filters);//打印结果QMapIterator<QString,QStringList>i(allFiles);while(i.hasNext()){i.next();qDebug()<< "Directory:"<< i.key();qDebug()<< "Files:";foreach(constQString&file,i.value()){qDebug()<< ""<< file;}}```注意事项:1.如果目录树很大,这个函数可能会花费较长时间,建议在单独的线程中执行,避免阻塞UI线程。2.这里我们使用了QMap来存储结果,其中目录路径为key,这样输出时是有序的(按字典序)。如果需要按遍历顺序,可以使用QHash和QLinkedList等。改进:如果遇到权限问题,可能无法进入某些子目录,这时候我们可以通过设置QDirIterator::IteratorFlag,比如使用QDirIterator::FollowSymlinks可以跟踪符号链接(这里我们没有使用,因为设置了NoSymLinks,所以跳过了符号链接)。如果需要处理符号链接,请去掉NoSymLinks标志,并调整过滤器。另外,如果需要包括隐藏文件(在Linux中常见),需要在QDir的过滤器中添加QDir::Hidden。以上代码在Qt5.14环境下编写,使用C++。注意:在Windows上,路径分隔符可以使用正斜杠或反斜杠,Qt内部会处理。但当我们输出路径时,可能是使用反斜杠(因为Windows的文件系统返回的是反斜杠),但Qt的QDir返回的路径是统一使用正斜杠。所以可移植。请根据实际需求调整。</think> ### 使用Qt5.14遍历目录并获取子文件夹及特定类型文件的示例代码 以下是符合要求的Qt5.14实现,该代码能够: 1. 遍历指定目录下的所有子文件夹 2. 在每个文件夹中搜索特定类型的文件 3. 处理可能出现的权限问题 4. 显示详细结果 ```cpp #include <QDir> #include <QDirIterator> #include <QFileInfo> #include <QDebug> #include <QSet> // 主函数:遍历目录并获取文件 QMap<QString, QVector<QFileInfo>> findFilesInSubdirectories(const QString& rootPath, const QStringList& fileFilters) { QMap<QString, QVector<QFileInfo>> result; // 验证根目录是否存在 if (!QDir(rootPath).exists()) { qWarning() << "根目录不存在:" << rootPath; return result; } // 设置迭代器选项 QDirIterator::IteratorFlags flags = QDirIterator::Subdirectories | QDirIterator::FollowSymlinks; // 遍历目录结构 QDirIterator dirIt(rootPath, QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoSymLinks, flags); while (dirIt.hasNext()) { QString dirPath = dirIt.next(); QDir currentDir(dirPath); // 获取当前目录下的特定类型文件 QVector<QFileInfo> files; for (const QString& filter : fileFilters) { QFileInfoList fileList = currentDir.entryInfoList({filter}, QDir::Files | QDir::Readable); for (const QFileInfo& fileInfo : fileList) { files.append(fileInfo); } } // 如果目录中有匹配的文件,添加到结果 if (!files.isEmpty()) { result.insert(currentDir.absolutePath(), files); } } // 检查根目录自身(QDirIterator会跳过根目录) QDir rootDir(rootPath); QVector<QFileInfo> rootFiles; for (const QString& filter : fileFilters) { QFileInfoList fileList = rootDir.entryInfoList({filter}, QDir::Files | QDir::Readable); for (const QFileInfo& fileInfo : fileList) { rootFiles.append(fileInfo); } } if (!rootFiles.isEmpty()) { result.insert(rootDir.absolutePath(), rootFiles); } return result; } // 示例用法: int main() { QString rootPath = "C:/Documents"; // 替换为实际路径 QStringList filters = {"*.txt", "*.jpg", "*.pdf"}; // 替换为实际文件类型 QMap<QString, QVector<QFileInfo>> fileMap = findFilesInSubdirectories(rootPath, filters); // 打印结果 qDebug() << "找到" << fileMap.size() << "个包含文件目录:"; for (auto it = fileMap.begin(); it != fileMap.end(); ++it) { qDebug() << "\n目录:" << it.key(); for (const QFileInfo& file : it.value()) { qDebug() << " -" << file.fileName() << "| 大小:" << file.size() << "字节"; } } return 0; } ``` ### 代码功能说明 1. **核心组件**: - `QDirIterator`:递归遍历目录结构 - `QDir::entryInfoList()`:获取特定类型的文件 - `QFileInfo`:存储文件详细信息 2. **参数说明**: - `rootPath`:要遍历的根目录路径 - `fileFilters`:文件扩展名过滤器(如`*.txt`, `*.jpg`) 3. **输出结构**: - `QMap<目录路径, 文件列表>`格式 - 每个文件包含名称、大小等元数据 ### 最佳实践建议 1. **异步处理**: ```cpp // 在实际GUI应用中应在工作线程执行此操作 QtConcurrent::run([=](){ auto results = findFilesInSubdirectories(path, filters); // 完成后通过信号传递结果 }); ``` 2. **添加进度反馈**: ```cpp // 在遍历循环中添加 int count = 0; while (dirIt.hasNext()) { // ...处理代码... count++; if (count % 10 == 0) { emit progressUpdated(count); // 自定义信号 } } ``` 3. **错误处理增强**: ```cpp if (!currentDir.isReadable()) { qWarning() << "无法读取目录:" << currentDir.path(); continue; } ``` ### 替代实现方式 ```cpp // 使用递归方法(适合小规模目录) void findFilesRecursive(const QDir& dir, QMap<QString, QVector<QFileInfo>>& result, const QStringList& filters) { // 处理当前目录文件 auto files = dir.entryInfoList(filters, QDir::Files); if (!files.isEmpty()) { result[dir.path()] = files; } // 递归处理子目录 auto subdirs = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); for (const auto& subdir : subdirs) { findFilesRecursive(QDir(dir.filePath(subdir)), result, filters); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值