使用DictReader时替换字段名

che*_*run 6 python csv json etl

我有一个test.csv文件:

foo,bar,foobar,barfoo

1,2,3,4
5,6,7,8
9,10,11,12
Run Code Online (Sandbox Code Playgroud)

以下CSV解析器:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import csv
import json

f = open ( 'test.csv', 'r' )

reader = csv.DictReader( f, fieldnames = ( "foo","bar","foobar","barfoo" ))

out = json.dumps( [ row for row in reader ], ensure_ascii=False, encoding="utf-8")

print out
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法来替换输出中的字段名,而无需更改CSV文件的标题?

我目前的输出是这样的:

[
   {
      "foobar":"foobar",
      "foo":"foo",
      "bar":"bar",
      "barfoo":"barfoo"
   },
   {
      "foobar":"3",
      "foo":"1",
      "bar":"2",
      "barfoo":"4"
   },
   {
      "foobar":"7",
      "foo":"5",
      "bar":"6",
      "barfoo":"8"
   },
   {
      "foobar":"11",
      "foo":"9",
      "bar":"10",
      "barfoo":"12"
   }
]
Run Code Online (Sandbox Code Playgroud)

我可以得到这样的东西:

[
   {
      "id":"foobar",
      "email":"foo",
      "name":"bar",
      "phone":"barfoo"
   },
   {
      "id":"3",
      "email":"1",
      "name":"2",
      "phone":"4"
   },
   {
      "id":"7",
      "email":"5",
      "name":"6",
      "phone":"8"
   },
   {
      "id":"11",
      "email":"9",
      "name":"10",
      "phone":"12"
   }
]
Run Code Online (Sandbox Code Playgroud)

jam*_*lak 9

最简单的方法是设置:

reader.fieldnames = "email", "name", "id",  "phone"
Run Code Online (Sandbox Code Playgroud)

如果你愿意,也可以保存旧的字段名.


Ole*_*rov 8

只需替换这一行:

reader = csv.DictReader(f, fieldnames = ( "foo","bar","foobar","barfoo" ))
Run Code Online (Sandbox Code Playgroud)

有了这个:

reader = csv.DictReader(f, fieldnames=("id", "email", "name", "phone"))
Run Code Online (Sandbox Code Playgroud)