2017-08-21 19 views
1

我有用於分析大量的數據(形式的兩個不同文件的代碼需要被用空格隔開的值,它隨後計算相對於這些值之間的差異並將它們寫入另一個文件中)。重複的程序多次(導電的計算和在另一文件中寫入結果)

from itertools import islice 

with open('ex_original_1.idl') as f1, open('ex_new_1.idl') as f2: 
    with open('ex_dif_1.txt', 'w') as f3: 
     f1 = islice(f1, 905, None) # skip first 905 lines 
     f2 = islice(f2, 905, None) # skip first 905 lines 

     for f1_line, f2_line in zip(f1, f2): 
      f1_vals = map(float, f1_line.strip().split()) 
      f2_vals = map(float, f2_line.strip().split()) 
      for v1, v2 in zip(f1_vals, f2_vals): 
       try: 
        result = v1/v2 
        f3.write(str(result)+"\n") 
       except ZeroDivisionError:   #should there be a value of zero 
        print("Encountered a value equal to zero in the second file. Skipping...") 
        continue 

雖然它運作良好,對兩個文件(ex_original_1.idl和ex_new_1.idl),我也有相同的類型(〜500)的很多文件。我想多執行一次這個程序,輸出文件應該按邏輯順序命名:ex_dif_1.txt。爲了使事情更有條理,在2種不同類型(ex_original_i和ex_new_i)位於不同的目錄,我還想寫在一個單獨的目錄中的新文件(如果我理解正確,在文件名前我包括所有的路徑文件,是嗎?)。總括來說,我已經是文件:

  • ex_original_1,ex_original_2,ex_original_3 ... ex_original_500
  • ex_new_1,ex_new_2,ex_new_3 ... ex_original_500

我想獲得:

  • ex_dif_1,ex_dif_2,ex_dif_3 ... ex_dif_500

使用這行代碼,只能使用一次。 如果讓另一個單獨的程序多次運行這個程序是合適的,或者應該在這個已有的程序中包含一個命令,那麼應該讚賞一個例子嗎?

希望它是很清晰。先謝謝您的幫助。

回答

0

如果文件存在於不同的文件夾,這將是不同的。讓我知道確切的情況。

如果出現在同一個文件夾,你可以試試這個。

代替硬編碼的文件名,讓他們動態!如果該outfile不存在,請獲取默認名稱,否則加上舊文件。

>>> import os 
>>> files = [f for f in os.listdir('.') if f.lower().startswith('ex_dif_')] 
>>> files 
['ex_dif_1.txt'] 
>>> outfile="outfilefolder/ex_diff_%d.txt" 
>>> number = 1 
>>> if files:number=int(max(files,key=os.path.getctime).split('_')[2].split('.')[0])+1 
>>> outfile=outfile%(number) if files else outfile%1` 
>>> print outfile 
'ex_diff_2.txt' 

類似地,對於ex_orignal和ex_new輸入文件。

>>> ofile="ofilefolder/ex_original_%d.idl" 
>>> ofile1=ofile%(number) if files else ofile%1` 
>>> nfile="nfilefolder/ex_new_%d.idl" 
>>> nfile=nfile%(number) if files else nfile%1` 

更改打開文件的部分以獲取動態生成的名稱。

with open(ofile) as f1, open(filen) as f2: 
    with open(outfile, 'w') as f3: 
+0

是的,費爾位於不同的文件夾中。 ex_original_i和ex_new_i位於單獨的文件夾中。我想計算到另一個文件夾的差異。 – Robert

+0

我已添加編輯! –

+0

對不起,我沒有看到它。我已經按照你的建議寫了(我希望是正確的)。它給出了一個錯誤:max()arg是一個空序列。 我應該問另一個問題,併發布整個書面代碼? – Robert

0

用循環啓動程序。想這應該爲你工作...

list_of_files = os.listdir("path to files") 
in1files = [file for file in list_of_files if file.startswith('ex_original_')] 
in2files = [file for file in list_of_files if file.startswith('ex_new_')] 
outfiles=[] 
for i in range(0,len(in1files)): 
    outfile = "ex_dif_"+str(i+1) 
    file1 = in1files[i] 
    file2 = in2files[i] 
    with open(file1,'r') as f1, open(file2,'r') as f2: 
     with open(outfile, 'w') as f3: 
      {your stuff continues here on....} 
+0

完成後關閉文件。如果文件位於不同的目錄中,那麼只需使用os.listdir(「path」)方法將值分配給列表。我在發佈之前沒有運行過這個程序,所以如果你遇到任何錯誤,請告訴我...... – Abhijeetk431

+1

當你打開一個文件['with'statement](https://docs.python.org/2.7/reference/compound_stmts.html #with-statement)你不需要明確地關閉它們! –

+0

我不知道這些..感謝您的信息;) – Abhijeetk431

相關問題