corpus_files
関数を以下のように展開してみると理解しやすいかと思います。
Python
1# 「./text」ディレクトリから「'.txt'」で終わらないパス(=ディレクトリ)を取得
2dirs = []
3lists = listdir('./text')
4for x in lists:
5 if not x.endswith('.txt'):
6 #if path.isdir(path.join('./text',x)): # まだこちらのほうがまし
7 dir = path.join('./text', x)
8 dirs.append(dir)
9print('dirs:',dirs)
10
11# 各ディレクトリから「LICENSE」で始まらないパスを取得
12docs = []
13for x in dirs:
14 lists = listdir(x)
15 print('listdir:',x, lists)
16 for y in lists:
17 if not y.startswith('LICENSE'):
18 doc = path.join(x, y)
19 docs.append(doc)
20print('docs',docs)
ただし元関数にはバグがあり「LICENSE.txt」も取得しています。
Python
1def corpus_files():
2 dirs = [path.join('./text', x)
3 for x in listdir('./text') if not x.endswith('.txt')]
4 docs = [path.join(x, y)
5 for x in dirs for y in listdir(x) if not x.startswith('LICENSE')]
6 #for x in dirs for y in listdir(x) if not y.startswith('LICENSE')] # こちらを意図したはず
7 return docs
8
9print(corpus_files())
複数のディレクトリに対して検索をかけてほしい場合、./textの部分をどのように変更すればよいですか?
私なら、以下のように関数を修正します。
- 引数で、検索対象ディレクトリを指定できるように
glob
を利用し、サブフォルダも含めて再帰的に.txt
を検索
- 除外ファイルを明示的に指定
def corpus_files(base_dir):
import glob
findPath = path.join( base_dir, 'text/**/*.txt') # 「text」まで呼出元で指定させるほうがスマートだが
paths = glob.glob( findPath,recursive=True)
docs = []
ignore = ('LICENSE.txt','README.txt','CHANGES.txt')
for p in paths:
if path.basename(p) not in ignore:
docs.append(p)
return docs
print( corpus_files('./')) # 相対パスで
print( corpus_files('c:/hoge/huga/')) # 絶対パスで
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/30 03:01