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)
答
Lambda表达式的syntax在Python是:
lambda [list of arguments]: <expression>
在你的代码没有为你的lambdas定义任何参数。您需要:
字符前加一个名为line
参数,使您的工作代码:
lambda line: write_csv(m, line), lambda line: write_csv(u, line)
您的lambda表达式不定义任何* *参数 - 例如尝试'lambda行:write_csv(...)' – jonrsharpe
或者因为他们已经可以访问'line',所以不用调用它们。 –
当你的'process_line'将'line'变成'row'时,我认为如果你使用'row'这个名字作为变量,那么会更清楚。所以lambda中的变量名是'row',并且不会影响原来的'line' – GP89