web-dev-qa-db-ja.com

すべてのディレクトリ内のすべてのファイルを読み取る

単一のテキストファイルの値を読み取るコードが機能していますが、すべてのディレクトリからすべてのファイルを読み取り、すべてのコンテンツをまとめるのに問題があります。

これが私が持っているものです:

filename = '*'
filesuffix = '*'
location = os.path.join('Test', filename + "." + filesuffix)
Document = filename
thedictionary = {}
with open(location) as f:
 file_contents = f.read().lower().split(' ') # split line on spaces to make a list
 for position, item in enumerate(file_contents): 
     if item in thedictionary:
      thedictionary[item].append(position)
     else:
      thedictionary[item] = [position]
wordlist = (thedictionary, Document)
#print wordlist
#print thedictionary

ファイル名にはワイルドカード*を、ファイルサフィックスにはワイルドカードを使用しようとしていることに注意してください。次のエラーが発生します。

"IOError:[Errno 2]そのようなファイルまたはディレクトリはありません: 'Test /'"

これが正しい方法であるかどうかはわかりませんが、どういうわけかワイルドカードを機能させると、機能するはずです。

私はこの例を機能させました: Python-サブディレクトリ(そこにあります)に見つからないディレクトリファイルからファイルを読み取る

これは少し異なりますが、すべてのファイルを読み取るように更新する方法がわかりません。この最初のコードセットでは、次のように考えています。

previous_dir = os.getcwd()
os.chdir('testfilefolder')
#add something here?
for filename in os.listdir('.'):

外側のforループがあるが、何を入れるべきかよくわからない場合は、何かを追加する必要があります。

何かご意見は?

12
Relative0

Pythonは、open()呼び出しのファイル名で直接ワイルドカードをサポートしていません。代わりに glob module を使用して単一レベルのサブディレクトリからファイルをロードするか、 os.walk() を使用してウォークする必要があります。任意のディレクトリ構造。

すべてのサブディレクトリ内のすべてのテキストファイルを1レベル深く開く:

import glob

for filename in glob.iglob(os.path.join('Test', '*', '*.txt')):
    with open(filename) as f:
        # one file open, handle it, next loop will present you with a new file.

ディレクトリの任意のネストですべてのテキストファイルを開く:

import os
import fnmatch

for dirpath, dirs, files in os.walk('Test'):
    for filename in fnmatch.filter(files, '*.txt'):
        with open(os.path.join(dirpath, filename)):
            # one file open, handle it, next loop will present you with a new file.
18
Martijn Pieters