2017-06-20 15 views
3

我有一個使用文本的大塊訓練模型的腳本。Python進程多個文件反覆,沒有明確的for循環

python myscript.py -i trainingdata.txt 

cat trainingdata.txt | python myscript.py 

第二個版本是特別有用的:它現在所寫的,我可以從一個文件或標準輸入無論是讀

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')) 

然後我可以把我的腳本結合的方式如果我想搜索文件系統,並使用多個文件來訓練模型。然而,這會變得非常複雜,由於管道,如果我同時嘗試使用cProfiler

python -m cProfile myscript.py ... 

我知道我可以使用-i選項發送多個文件來分析,並逐一查看這些文件,但然後我會必須改變train()方法的行爲以避免覆蓋數據。

是否有打開的IO通道中,對於沒有更好的表達的一個好辦法,那串接不受線明確讀寫線輸入?

+0

我覺得你可能想看看熊貓。 – mauve

+0

@mauve我已經在這個項目中與大熊貓一起工作,你指的是什麼? – posdef

+0

我認爲這將有助於「不逐行閱讀」部分。我有一些代碼,我打開目錄中的每個文件,將它讀入DataFrame,連接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

有趣的..應該模仿管道貓命令的行爲..是否有更通用的方式來寫一個任意的'with'語句(可能很大)的文件數量? – posdef

+0

@posdef試圖做到這一點。這或多或少是你的意思? –