将CSV文件转换为具有精确类型和顺序的词典列表

2024-04-30 02:27:42 发布

您现在位置:Python中文网/ 问答频道 /正文

所有内容都在标题中,我发现这段代码几乎满足了我的要求: https://stackoverflow.com/a/21572244/5455842

import csv

with open('test.csv') as f:
    a = [{k: int(v) for k, v in row.items()}
        for row in csv.DictReader(f, skipinitialspace=True)]

我的CSV由5列6行组成(第一行是字段名)。

我的问题如下:

  • 我的csv的第三列是日期,需要是datetime.date对象
  • 我的csv的第四列是多个整数,需要是int的dict
  • 假设我的五列是“1”、“2”、“3”、“4”、“5”:我需要代码以精确的顺序列出dict,即:3,1,2,5,4

    以下是一些示例数据:
Firstname,Lastname,Birthdate,Answers(good/middle/bad),Comments
Mark,Tolonen,12/10/1986,"3154,0",The first one
John,Travolta,02/18/1954,"42,21",Would grease again
Albert,Einstein,03/14/1879,"18,19,20",This guy is not stupid
Isaac,Newton,12/25/1642,"2000,20,20", Should eat apple
Alan,Turing,06/23/1912,"42,42,42",Hey what's up

下面是一个理想的例子:

[{'Birthdate': datetime.date(1986, 12, 10),
  'Comments': 'The first one',
  'Firstname': 'Mark',
  'Lastname': 'Tolonen',
  'Answers(good/middle/bad)': [3154, 0]},
 {'Birthdate': datetime.date(1954, 02, 18),
  'Comments': 'Would grease again',
  'Firstname': 'John',
  'Lastname': 'Travolta',
  'Answers(good/middle/bad)': [42, 21]},
...
}]

Tags: csv代码inmiddlefordatetimedatefirstname
1条回答
网友
1楼 · 发布于 2024-04-30 02:27:42

给定示例数据和所需输出,如果使用Python 3.7或更高版本,字典顺序将与所需顺序相同:

import csv
from datetime import datetime
from pprint import pprint

order = 'Birthdate','Comments','Firstname','Lastname','Answers(good/middle/bad)'

with open('input.csv') as f:
    reader = csv.DictReader(f)
    data = []

    for row in reader:

        # Post-process the non-string columns.
        row['Birthdate'] = datetime.strptime(row['Birthdate'],'%m/%d/%Y').date()
        row['Answers(good/middle/bad)'] = [int(x) for x in row['Answers(good/middle/bad)'].split(',')]

        # Re-write the dict with the desired key order.
        # Python 3.7 (or CPython 3.6) or later required to keep insertion order.
        # 3.7 made insertion order preservation part of the language spec.
        # Specifically, the implementation of CPython 3.6 preserves insertion order
        # as an implementation detail.
        # For older versions use collections.OrderedDict instead.
        data.append({k:row[k] for k in order})
        
pprint(data)

输出:

[{'Birthdate': datetime.date(1986, 12, 10),
  'Comments': 'The first one',
  'Firstname': 'Mark',
  'Lastname': 'Tolonen',
  'Answers(good/middle/bad)': [3154, 0]},
 {'Birthdate': datetime.date(1954, 2, 18),
  'Comments': 'Would grease again',
  'Firstname': 'John',
  'Lastname': 'Travolta',
  'Answers(good/middle/bad)': [42, 21]},
 {'Birthdate': datetime.date(1879, 3, 14),
  'Comments': 'This guy is not stupid',
  'Firstname': 'Albert',
  'Lastname': 'Einstein',
  'Answers(good/middle/bad)': [18, 19, 20]},
 {'Birthdate': datetime.date(1642, 12, 25),
  'Comments': ' Should eat apple',
  'Firstname': 'Isaac',
  'Lastname': 'Newton',
  'Answers(good/middle/bad)': [2000, 20, 20]},
 {'Birthdate': datetime.date(1912, 6, 23),
  'Comments': "Hey what's up",
  'Firstname': 'Alan',
  'Lastname': 'Turing',
  'Answers(good/middle/bad)': [42, 42, 42]}]

相关问题 更多 >