def addPath(self, directoryPath): r''' Add a directory path to a local corpus: >>> localCorpus = corpus.corpora.LocalCorpus('a new corpus') >>> localCorpus.addPath('~/Desktop') Paths added in this way will not be persisted from session to session unless explicitly saved by a call to ``LocalCorpus.save()``. ''' from music21 import corpus if not isinstance(directoryPath, (str, pathlib.Path)): raise corpus.CorpusException( 'an invalid file path has been provided: {0!r}'.format( directoryPath)) directoryPath = common.cleanpath(directoryPath, returnPathlib=True) if (not directoryPath.exists() or not directoryPath.is_dir()): raise corpus.CorpusException( 'an invalid file path has been provided: {0!r}'.format( directoryPath)) if self.name not in LocalCorpus._temporaryLocalPaths: LocalCorpus._temporaryLocalPaths[self.name] = set() LocalCorpus._temporaryLocalPaths[self.name].add(directoryPath) self._removeNameFromCache(self.name)
def _findPaths(self, rootDirectoryPath, fileExtensions): ''' Given a root filePath file path, recursively search all contained paths for files in `rootFilePath` matching any of the file extensions in `fileExtensions`. The `fileExtensions` is a list of file file extensions. NB: we've tried optimizing with `fnmatch` but it does not save any time. ''' from music21 import corpus matched = [] if six.PY2: rootDirectoryPath = six.u(rootDirectoryPath) for rootDirectory, directoryNames, filenames in os.walk(rootDirectoryPath): if '.svn' in directoryNames: directoryNames.remove('.svn') for filename in filenames: try: if filename.startswith('.'): continue except UnicodeDecodeError as error: raise corpus.CorpusException( 'Incorrect filename in corpus path: {0}: {1!r}'.format(filename, error)) for extension in fileExtensions: if filename.endswith(extension): matched.append(os.path.join(rootDirectory, filename)) break return matched