Python:如何仅将一个变量传递给lambda函数?

Python:如何仅将一个变量传递给lambda函数?

问题描述:

我的代码正在逐行读取文本文件。然后每一行都将所有空白字符修剪为一个空格字符,并根据它是否匹配该模式,然后将其写入到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

Lambda表达式的syntax在Python是:

lambda [list of arguments]: <expression> 

在你的代码没有为你的lambdas定义任何参数。您需要:字符前加一个名为line参数,使您的工作代码:

lambda line: write_csv(m, line), lambda line: write_csv(u, line)