2015-11-06 118 views
0

我的代碼正在逐行讀取文本文件。然後每一行都將所有空白字符修剪爲一個空格字符,並根據它是否匹配該模式,然後將其寫入到matched_data_file或unmatched_data_file中。在這個特定的例子中,我必須使用lambda。我認爲錯誤在於以下行,但我不是100%確定:Python:如何僅將一個變量傳遞給lambda函數?

success(line=row) if pattern.match(line) else failure(line=row) 

任何幫助,非常感謝,提前致謝!

我收到以下錯誤信息:

Traceback (most recent call last): File "model_dev_txt_to_csv.py", line 26, in process(source_filename) File "model_dev_txt_to_csv.py", line 23, in process process_line(line, lambda: write_csv(m, line), lambda: write_csv(u, line)) File "model_dev_txt_to_csv.py", line 12, in process_line return success(line=row) if pattern.match(line) else failure(line=row) TypeError:() got an unexpected keyword argument 'line'

以下是我當前的代碼:

import re 
import csv 

pattern = re.compile("([0-9]+) +([0-9\.-]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+) +([0-9\.\-+Ee]+)") 
source_filename = "track_param_hist.txt" 
matched_data_file = "good_hist_csv.csv" 
unmatched_data_file = "bad_hist_csv.csv" 

def process_line(line, success, failure): 
    # Make sure all whitespace is reduced to one space character 
    row = (' '.join(line.split())).split(' ') 
    success(line=row) if pattern.match(line) else failure(line=row) 

def write_csv(file, line): 
    csv.writer(file).writerow(line) 

def process(source): 
    print("Script for splitting text file into two separate csvs...") 
    with open(matched_data_file, 'w') as m: 
     with open(unmatched_data_file, 'w') as u: 
      with open(source) as f: 
       for line in f: 
        process_line(line, lambda: write_csv(m, line), lambda: write_csv(u, line)) 

if __name__ == "__main__": 
    process(source_filename) 
+0

您的lambda表達式不定義任何* *參數 - 例如嘗試'lambda行:write_csv(...)' – jonrsharpe

+0

或者因爲他們已經可以訪問'line',所以不用調用它們。 –

+0

當你的'process_line'將'line'變成'row'時,我認爲如果你使用'row'這個名字作爲變量,那麼會更清楚。所以lambda中的變量名是'row',並且不會影響原來的'line' – GP89

回答

2

Lambda表達式的syntax在Python是:

lambda [list of arguments]: <expression> 

在你的代碼沒有爲你的lambdas定義任何參數。您需要:字符前加一個名爲line參數,使您的工作代碼:

lambda line: write_csv(m, line), lambda line: write_csv(u, line) 
相關問題