2017-06-20 5 views
3

私は、モデルを訓練するために大量のテキストを使用するスクリプトを用意しています。私は、ファイルから読み取るかPythonは複数のファイルを明示的にforループなしで処理します

parser.add_argument('-i', help='input_file', default=sys.stdin) 
... # do a bunch of other stuff 
if args.i is sys.stdin: 
    m.train(args.i) 
else: 
    m.train(open(args.i, 'r')) 

を標準入力するか、それが今で書かれている方法は、私のように私のスクリプトを呼び出すことができます。

python myscript.py -i trainingdata.txt 

または

cat trainingdata.txt | python myscript.py 

番目のバージョンは、特に便利です私がファイルシステムを検索し、複数のファイルを使ってモデルを訓練したいのであれば。私は同時に私は-iオプションを使用して複数のファイルを送ることができることを知っている

cProfilerすなわち

python -m cProfile myscript.py ... 
使用してプロファイリングしてみてください、そしてファイルを反復が、その後、私は意志ただしこれは、パイプに、トリッキーになりデータを上書きしないようにするには、 train()メソッドの動作を変更する必要があります。

明示的に読んだり書いたりせずに入力を連結する、より良い表現の欠如のために、IOチャネルを開く良い方法はありますか?ファイル名から

+0

あなたがパンダに見たいと思うかもしれませんように私は感じます。 – mauve

+0

@mauve私はすでにこのプロジェクトでパンダと仕事をしていますが、具体的には何を指していますか? – posdef

+0

私はそれが "行単位で読み込まない"部分に役立つと思った。私はディレクトリ内の各ファイルを開き、DataFramesに読み込み、DataFramesを連結し、時間でソートし、CSV形式で10時間チャンクとして出力するコードをいくつか持っています。 – mauve

答えて

2

することができますchain開いているファイルやyield開いているファイルへの発電機を使用します。

from itertools import chain 

def yield_open(filenames): 
    for filename in filenames: 
     with open(filename, 'r') as file: 
      yield file 

def train(file): 
    for line in file: 
     print(line, end='') 
    print() 

files = chain.from_iterable(yield_open(filenames=['file1.txt', 'file2.txt'])) 
train(files) 

このファイルの一方のみが一度に開いているという利点もあります。

あなたも(読みやすくすることができる)「データ・パイプライン」としてそれを使用できます。

file_gen = yield_open(filenames=['file1.txt', 'file2.txt']) 
files = chain.from_iterable(file_gen) 
train(files) 
+0

面白い..パイプの 'cat'コマンドの振る舞いを模倣すべきです。' with'文を書くためのより一般的な方法があります(潜在的に大きい)ファイル数? – posdef

+0

@posdefがそれを試みました。あなたは何を意味するのでしょうか? –

関連する問題