txt - leer archivos de una carpeta matlab
¿Cómo obtener todos los archivos bajo un directorio específico en MATLAB? (8)
Con poca modificación, pero con un enfoque casi similar para obtener la ruta completa del archivo de cada subcarpeta
dataFolderPath = ''UCR_TS_Archive_2015/'';
dirData = dir(dataFolderPath); %# Get the data for the current directory
dirIndex = [dirData.isdir]; %# Find the index for directories
fileList = {dirData(~dirIndex).name}''; %''# Get a list of the files
if ~isempty(fileList)
fileList = cellfun(@(x) fullfile(dataFolderPath,x),... %# Prepend path to files
fileList,''UniformOutput'',false);
end
subDirs = {dirData(dirIndex).name}; %# Get a list of the subdirectories
validIndex = ~ismember(subDirs,{''.'',''..''}); %# Find index of subdirectories
%# that are not ''.'' or ''..''
for iDir = find(validIndex) %# Loop over valid subdirectories
nextDir = fullfile(dataFolderPath,subDirs{iDir}); %# Get the subdirectory path
getAllFiles = dir(nextDir);
for k = 1:1:size(getAllFiles,1)
validFileIndex = ~ismember(getAllFiles(k,1).name,{''.'',''..''});
if(validFileIndex)
filePathComplete = fullfile(nextDir,getAllFiles(k,1).name);
fprintf(''The Complete File Path: %s/n'', filePathComplete);
end
end
end
Necesito obtener todos esos archivos en D:/dic
y recorrerlos para procesarlos individualmente.
¿MATLAB admite este tipo de operaciones?
Se puede hacer en otros scripts como PHP, Python ...
Está buscando un dir para devolver el contenido del directorio.
Para recorrer los resultados, simplemente puede hacer lo siguiente:
dirlist = dir(''.'');
for i = 1:length(dirlist)
dirlist(i)
end
Esto debería darle salida en el siguiente formato, por ejemplo:
name: ''my_file''
date: ''01-Jan-2010 12:00:00''
bytes: 56
isdir: 0
datenum: []
Esta es una función práctica para obtener nombres de archivos, con el formato especificado (generalmente .mat
) en una carpeta raíz.
function filenames = getFilenames(rootDir, format)
% Get filenames with specified `format` in given `foler`
%
% Parameters
% ----------
% - rootDir: char vector
% Target folder
% - format: char vector = ''mat''
% File foramt
% default values
if ~exist(''format'', ''var'')
format = ''mat'';
end
format = [''*.'', format];
filenames = dir(fullfile(rootDir, format));
filenames = arrayfun(...
@(x) fullfile(x.folder, x.name), ...
filenames, ...
''UniformOutput'', false ...
);
end
En tu caso, puedes usar el siguiente fragmento :)
filenames = getFilenames(''D:/dic/**'');
for i = 1:numel(filenames)
filename = filenames{i};
% do your job!
end
Esta respuesta no responde directamente la pregunta, pero puede ser una buena solución fuera de la caja.
Volví a subir la solución de gnovice, pero quiero ofrecer otra solución: use el comando dependiente del sistema de su sistema operativo:
tic
asdfList = getAllFiles(''../TIMIT_FULL/train'');
toc
% Elapsed time is 19.066170 seconds.
tic
[status,cmdout] = system(''find ../TIMIT_FULL/train/ -iname "*.wav"'');
C = strsplit(strtrim(cmdout));
toc
% Elapsed time is 0.603163 seconds.
Positivo:
- Muy rápido (en mi caso para una base de datos de 18000 archivos en Linux).
- Puede usar soluciones bien probadas.
- No necesita aprender o reinventar una nueva sintaxis para seleccionar, por ejemplo, archivos
*.wav
.
Negativo:
- Usted no es independiente del sistema.
- Confías en una sola cadena que puede ser difícil de analizar.
No conozco un método de función única para esto, pero puede usar genpath
para genpath
una lista de subdirectorios solamente . Esta lista se devuelve como una cadena de directorios delimitada por punto y coma, por lo que deberá separarla mediante strread, es decir,
dirlist = strread(genpath(''/path/of/directory''),''%s'',''delimiter'','';'')
Si no desea incluir el directorio dado, elimine la primera entrada de dirlist
, es decir, dirlist(1)=[];
ya que siempre es la primera entrada.
Luego obtenga la lista de archivos en cada directorio con un directorio en bucle.
filenamelist=[];
for d=1:length(dirlist)
% keep only filenames
filelist=dir(dirlist{d});
filelist={filelist.name};
% remove ''.'' and ''..'' entries
filelist([strmatch(''.'',filelist,''exact'');strmatch(''..'',filelist,''exact''))=[];
% or to ignore all hidden files, use filelist(strmatch(''.'',filelist))=[];
% prepend directory name to each filename entry, separated by filesep*
for f=1:length(filelist)
filelist{f}=[dirlist{d} filesep filelist{f}];
end
filenamelist=[filenamelist filelist];
end
filesep
devuelve el separador de directorio para la plataforma en la que se ejecuta MATLAB.
Esto le da una lista de nombres de archivos con rutas completas en la lista de nombres de archivos de la matriz de celdas. No es la mejor solución, lo sé.
Puedes usar regexp o strcmp para eliminar .
y ..
O podría usar el campo isdir
si solo quiere archivos en el directorio, no carpetas.
list=dir(pwd); %get info of files/folders in current directory
isfile=~[list.isdir]; %determine index of files vs folders
filenames={list(isfile).name}; %create cell array of file names
o combine las dos últimas líneas:
filenames={list(~[list.isdir]).name};
Para una lista de carpetas en el directorio excluyendo. y ...
dirnames={list([list.isdir]).name};
dirnames=dirnames(~(strcmp(''.'',dirnames)|strcmp(''..'',dirnames)));
A partir de este punto, debe poder arrojar el código en un bucle for anidado y continuar buscando cada subcarpeta hasta que sus dirnames devuelvan una celda vacía para cada subdirectorio.
Utilicé el código mencionado en esta gran respuesta y lo amplié para admitir 2 parámetros adicionales que necesitaba en mi caso. Los parámetros son extensiones de archivo para filtrar y un indicador que indica si concatenar la ruta completa al nombre del archivo o no.
Espero que sea lo suficientemente claro y que alguien lo encuentre beneficioso.
function fileList = getAllFiles(dirName, fileExtension, appendFullPath)
dirData = dir([dirName ''/'' fileExtension]); %# Get the data for the current directory
dirWithSubFolders = dir(dirName);
dirIndex = [dirWithSubFolders.isdir]; %# Find the index for directories
fileList = {dirData.name}''; %''# Get a list of the files
if ~isempty(fileList)
if appendFullPath
fileList = cellfun(@(x) fullfile(dirName,x),... %# Prepend path to files
fileList,''UniformOutput'',false);
end
end
subDirs = {dirWithSubFolders(dirIndex).name}; %# Get a list of the subdirectories
validIndex = ~ismember(subDirs,{''.'',''..''}); %# Find index of subdirectories
%# that are not ''.'' or ''..''
for iDir = find(validIndex) %# Loop over valid subdirectories
nextDir = fullfile(dirName,subDirs{iDir}); %# Get the subdirectory path
fileList = [fileList; getAllFiles(nextDir, fileExtension, appendFullPath)]; %# Recursively call getAllFiles
end
end
Ejemplo para ejecutar el código:
fileList = getAllFiles(dirName, ''*.xml'', 0); %#0 is false obviously
Actualización: Dado que esta publicación es bastante antigua, y he modificado mucho esta utilidad para mi propio uso durante ese tiempo, pensé que debería publicar una nueva versión. Mi código más reciente se puede encontrar en The MathWorks File Exchange : dirPlus.m
. También puede obtener la fuente de GitHub .
Hice una serie de mejoras. Ahora le da opciones para anteponer la ruta completa o devolver solo el nombre del archivo (incorporado de Doresoom y Oz Radiano ) y aplicar un patrón de expresión regular a los nombres de los archivos (incorporado desde Peter D ). Además, agregué la capacidad de aplicar una función de validación a cada archivo, lo que le permite seleccionarlos según criterios distintos a solo sus nombres (es decir, tamaño del archivo, contenido, fecha de creación, etc.).
NOTA: En las versiones más nuevas de MATLAB (R2016b y posterior), ¡la función dir
tiene capacidades de búsqueda recursiva! De modo que puede hacer esto para obtener una lista de todos los archivos *.m
en todas las subcarpetas de la carpeta actual:
dirData = dir(''**/*.m'');
Código antiguo: (para la posteridad)
Aquí hay una función que busca recursivamente a través de todos los subdirectorios de un directorio determinado, recopilando una lista de todos los nombres de archivos que encuentra:
function fileList = getAllFiles(dirName)
dirData = dir(dirName); %# Get the data for the current directory
dirIndex = [dirData.isdir]; %# Find the index for directories
fileList = {dirData(~dirIndex).name}''; %''# Get a list of the files
if ~isempty(fileList)
fileList = cellfun(@(x) fullfile(dirName,x),... %# Prepend path to files
fileList,''UniformOutput'',false);
end
subDirs = {dirData(dirIndex).name}; %# Get a list of the subdirectories
validIndex = ~ismember(subDirs,{''.'',''..''}); %# Find index of subdirectories
%# that are not ''.'' or ''..''
for iDir = find(validIndex) %# Loop over valid subdirectories
nextDir = fullfile(dirName,subDirs{iDir}); %# Get the subdirectory path
fileList = [fileList; getAllFiles(nextDir)]; %# Recursively call getAllFiles
end
end
Después de guardar la función anterior en algún lugar de su ruta MATLAB, puede llamarla de la siguiente manera:
fileList = getAllFiles(''D:/dic'');