1. ホーム
  2. python

[解決済み] Pythonです。ラムダ関数に1つだけ変数を渡すには?

2022-02-16 08:58:18

質問

私のコードは、テキストファイルを一行ずつ読み込んでいます。各行は空白文字1文字に切り取られ、それがパターンにマッチするかどうかに基づいて、matched_data_file または unmatched_data_file のいずれかに書き込まれます。この例では、ラムダを使用しなければなりません。私はエラーが次の行にあると思うが、私は100%の確信を持っていない。

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

どんな助けでも大歓迎です、ありがとうございます。

以下のエラーメッセージが表示されます。

トレースバック (最も最近の呼び出し): ファイル "model_dev_txt_to_csv.py", 26行目、in process(source_filename) ファイル "model_dev_txt_to_csv.py", line 23, in process process_line(行, lambda: write_csv(m, 行), lambda: write_csv(u, 行)) ファイル "model_dev_txt_to_csv.py"、行 12、in プロセス_ライン return success(line=row) if pattern.match(line) else failure(line=row) TypeError: () は予期しないキーワードを受け取りました。 引数 '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)

解決方法は?

ラムダ式の 構文 をPythonで表現すると、次のようになります。

lambda [list of arguments]: <expression>

あなたのコードでは、ラムダに対する引数が定義されていません。という名前の引数を追加する必要があります。 line の前に : を使用することで、コードを動作させることができます。

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