我的代碼正在逐行讀取文本文件。然後每一行都將所有空白字符修剪爲一個空格字符,並根據它是否匹配該模式,然後將其寫入到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表達式不定義任何* *參數 - 例如嘗試'lambda行:write_csv(...)' – jonrsharpe
或者因爲他們已經可以訪問'line',所以不用調用它們。 –
當你的'process_line'將'line'變成'row'時,我認爲如果你使用'row'這個名字作爲變量,那麼會更清楚。所以lambda中的變量名是'row',並且不會影響原來的'line' – GP89