2016-12-09 7 views
0

test.csvのデータには国と部門だけが含まれています。これはwriter.writerow(data)に記入されます。辞書を使用してPythonを使用して列にデータを書き込む

writer = csv.DictWriterと入力してwriter.writeheader()を追加しました。

辞書の辞書のデータを使用して追加された列を入力しようとしています。データは、その列で約200行までが埋め尽くされます。

import json 
import csv 

def parse_file(input): 
    with open(input, 'r') as input: 
     content = input.readlines() 
     csv_file = open('test.csv', 'wb+') 

     writer = csv.DictWriter(csv_file, fieldnames=["employee_id", "firstname", "lastname", "country", "dept"], delimiter=',') 
     writer.writeheader() 

     dicts = [{'employee_id':'123456', 'firstname':'Tom', 'lastname':'jones' }] 

     for line in content: 
      line_segments = line.split('\t') 

      data = json.loads(line_segments[0]) 

      writer.writerow(data) 

      for d in dicts: 
       print(d['id']) 
       writer.writerow([d['employee_id'],d['firstname'],d['lastname']]) 

エラー:トレースバック状態でのエラーとして

Traceback (most recent call last): 
    File "parse_file.py", line 36, in <module> 
    parse_input_file(args.input_file) 
    File "parse_file.py", line 25, in parse_input_file 
    writer.writerow([d['femployee_id'],d['firstname'],d['lastname']]) 
    File "C:\Users\\AppData\Local\Continuum\Miniconda3\csv.py", line 152, in writerow 
    return self.writer.writerow(self._dict_to_list(rowdict)) 
    File "C:\Users\\AppData\Local\Continuum\Miniconda3\\lib\csv.py", line 148, in _dict_to_list 
    + ", ".join([repr(x) for x in wrong_fields])) 
ValueError: dict contains fields not in fieldnames: '123456', 'Tom', 'Jones' 
+0

'dicts = [{ 'EMPLOYEE_ID': '123456'、 'firstnameの': 'トム'、 '姓': 'ジョーンズ} ] '間違った考え方のcos' employee_id'は '123456'なので、headerは静的なので、値だけを書くことができます! '' "123456"、 "Tom"、 "jones"] 'キーを含めないでください! – dsgdfg

答えて

1

ValueError: dict contains fields not in fieldnames: 

クエリから来ている辞書はあなたがDictWriterで指定したフィールド名よりも多くのキーが含まれていますコンストラクタ。 csv.DictWriter

、あなたはとしてフィールド名を指定している:

fieldnames=["employee_id", "firstname", "lastname", "country", "dept"] 

しかし、あなたは、この行に3つしかdictの値を渡している:あなたが必要なもの

for d in dicts: 
    print(d['id']) 
    writer.writerow([d['employee_id'],d['firstname'],d['lastname']]) 

はupdationです辞書ののように、

dicts = {'employee_id':'123456', 'firstname':'Tom', 'lastname':'jones','country':'some_country_name', 'dept':'some_dept' } 

最終更新されたコードは次のようになります。

import json 
import csv 

def parse_file(input): 
    with open(input, 'r') as input: 
     content = input.readlines() 
     csv_file = open('test.csv', 'wb+') 

     writer = csv.DictWriter(csv_file, fieldnames=["employee_id", "firstname", "lastname", "country", "dept"], delimiter=',') 
     writer.writeheader() 

     dicts = {'employee_id':'123456', 'firstname':'Tom', 'lastname':'jones','country':'some_country_name', 'dept':'some_dept' } 

     for line in content: 
      line_segments = line.split('\t') 
      data = json.loads(line_segments[0]) 
      writer.writerow(data) 
      writer.writerow(dicts) 
+0

ありがとうございます。しかし問題は、 "country"、 "dept"のデータがparse_file(入力)の入力ファイルから来ていることです。辞書に指定されている最初の3列は、私が追加しているものです。 – Sam

+0

これらの列に何かを入れて無視する方法はありますか?辞書のものに与えられた値をすべての行に書き込むだけですか? – Sam

+0

「some_country_name writer.fileldnames [3]」のようなものを追加することはできますか? – Sam

関連する問題