問題:
writerows を使用してデータを CSV ファイルに書き込む場合、現在、入力として 1000001 を入力すると、次のエラーが表示されます。
ValueError: dict にはフィールド名にないフィールドが含まれています: 1, 0, 0, 0, 0, 0, 1
フィールド名は CSV (history.csv) に正しく書き込まれますが、結果には書き込まれません。
説明
このSOの質問から私の最初のプログラムを構築し 、CSVファイル内の特定の値を単一の列で検索し、行全体を返します。
検索データを簡単に追跡できるようにするために、検索機能からの出力を別の CSV ファイルに書き込もうとしています。私はまだ Python を学んでいるので、CSV を読んでから書くのが良いスタートになると感じました。
詳細
Windows 7 コンピューターで Python 3.2.3 を使用する
機能
プログラムは 3 つの関数で構築されています (はい、関数を書く練習をしたかったのです。これが意味をなさない場合は教えてください): search
、csv_record
、およびmain
。このsearch
関数は、元の SO の質問に由来しcsv_record
、書き込みコードを含み、main
それらすべてを接続してユーザー入力を求めるだけです。
サンプルデータ
1000001;Name here:1;1001;1;11;Item description here:1
1000002;Name here:2;1002;2;22;Item description here:2
1000003;Name here:3;1003;3;33;Item description here:3
1000004;Name here:4;1004;4;44;Item description here:4
1000005;Name here:5;1005;5;55;Item description here:5
1000006;Name here:6;1006;6;66;Item description here:6
1000007;Name here:7;1007;7;77;Item description here:7
1000008;Name here:8;1008;8;88;Item description here:8
1000009;Name here:9;1009;9;99;Item description here:9
コード
import sys
import traceback
from csv import DictReader
from csv import DictWriter
from collections import namedtuple
def search(user_input):
raw_data = 'active.csv'
with open(raw_data, 'r', newline='') as open_data:
read_data = DictReader(open_data, delimiter=';')
item_data = namedtuple('item_data', read_data.fieldnames)
for row in (item_data(**data) for data in read_data):
if row.Item == user_input:
return row
return
def csv_record(search_output,record_value):
hist_file = 'history.csv'
record_positive = 'Record has been written to CSV file'
record_negative = 'Recording has been disabled'
if record_value == 1:
with open(hist_file, 'w', newline='') as history:
history_dw = DictWriter(history, delimiter='\t', fieldnames=search_output._fields)
history_dw.writeheader()
history_dw.writerows(search_output)
return record_positive
else:
return record_negative
def main():
failure = 'No matching item could be found. Please try again.'
recording = 1
item = input("Please enter your item code: ")
result = search(item)
records = csv_record(result,recording)
print(records)
return
コメント
これが無料のコード作成サービスではないことは承知していますが、助けていただければ幸いです。writerows の使用方法について忘れていることはありますか? csv.py のソースを読むことについて私が理解していることから、CSV に書き込まれるときにユーザー入力を結果に結合しようとしています。私の目標は、ユーザー入力ではなく、結果のみを記述することです (これは別の学習事項になります)。コメントは削除しましたが、説明が必要な場合はお尋ねください。
資力