Python中含嵌套列表的字典数据如何正确存储至CSV?
解决Python字典含嵌套列表转CSV的问题
针对你这种混合了普通字段和嵌套列表的字典数据,我整理了3种实用方案,你可以根据自己的使用场景来选:
方案1:将嵌套列表合并为单行文本(适合快速查看)
如果只是想把所有内容塞进CSV,且不需要后续单独提取列表里的元素,可以把每个嵌套列表用分隔符(比如换行、分号)合并成一个字符串,这样前4个字段保持原样,嵌套字段也能在一个单元格里清晰显示。
示例代码:
import csv # 你的原始字典 data_dict = { 'ID': '1', 'Name': 'PROF DR BACHTIAR ALY MA', 'Faction': 'National Democrat Party Faction', 'Constituency': 'ACEH I', 'Educational Background': ['Sekolah Rakyat Tahun: - 1963', ' SMPN 1 Banda Aceh Tahun: - 1965', 'IPS SMA YPU Bandung Tahun: - 1968', 'Fakultas Publistik UNPAD Tahun: 1969 - 1971', 'Komunikasi Westfaelishe Wilhemlins Tahun: 1974 - ', 'Philosophische Universitas Westfalischen Jerman Tahun: - 1984'], 'Working Experience': ['Pokja Pengaduan Dewan Pers Sebagai: Anggota Tahun: 2003 - 2006', 'Anggota Dewan Pers Sebagai: Anggota Tahun: 2000 - 2003', 'Penasehat Ahli Kapolri Sebagai: Penasehat Tahun: 1999 - 2014', 'Konsultan PT Arun Sebagai: Tahun: 1989 - 1994', 'Kadin Indonesia Komite Cina Sebagai: Staf Ahli Tahun: 1985 - 1986', 'Penasehat Presiden Urusan Aceh Sebagai: Penasehat Tahun: - '], 'Organizational': ['BAKOM PKB Sebagai: Ketua Tahun: 1990 - 1995', 'PPI & IASI Jerman Sebagai: Ketua Tahun: 1976 - 1982', 'Ketua Warga SMP & Ketua Osis SMA Sebagai: Tahun: 1965 - 1968', 'KAPPI Daerah Itimewa Aceh Sebagai: Ketua Tahun: - 1968'], 'Movement': ['KAPPI Aceh - Ketua Tahun: - 1968'] } # 处理嵌套列表:用换行符合并,Excel打开时可设置单元格自动换行 processed_data = {} for key, value in data_dict.items(): if isinstance(value, list): processed_data[key] = '\n'.join(value) else: processed_data[key] = value # 写入CSV with open('politician_data.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.DictWriter(f, fieldnames=processed_data.keys()) writer.writeheader() writer.writerow(processed_data)
优点:操作简单,保留单条记录结构,可读性强;缺点:后续如果要拆分列表元素需要额外处理。
方案2:利用CSV多行单元格特性(兼顾可读性和可编辑性)
CSV本身支持单元格内换行,只要把包含换行的内容用引号包裹,Python的csv模块会自动处理这个逻辑。其实方案1的代码已经实现了这个效果——当你用'\n'合并列表时,写入CSV时模块会自动给这个单元格加引号,打开Excel/Numbers时,只要设置单元格“自动换行”,就能看到每行单独显示,完全不影响前4个字段的可读性。
方案3:规范化拆分记录(适合数据分析/数据库导入)
如果后续需要对教育背景、工作经历这些字段做单独分析(比如统计某类经历的人数),最专业的做法是把嵌套列表拆分成多条记录,重复前4个基础字段,每条记录对应一个列表元素。
示例代码(用pandas更简洁):
import pandas as pd # 原始字典 data_dict = { 'ID': '1', 'Name': 'PROF DR BACHTIAR ALY MA', 'Faction': 'National Democrat Party Faction', 'Constituency': 'ACEH I', 'Educational Background': ['Sekolah Rakyat Tahun: - 1963', ' SMPN 1 Banda Aceh Tahun: - 1965', 'IPS SMA YPU Bandung Tahun: - 1968', 'Fakultas Publistik UNPAD Tahun: 1969 - 1971', 'Komunikasi Westfaelishe Wilhemlins Tahun: 1974 - ', 'Philosophische Universitas Westfalischen Jerman Tahun: - 1984'], 'Working Experience': ['Pokja Pengaduan Dewan Pers Sebagai: Anggota Tahun: 2003 - 2006', 'Anggota Dewan Pers Sebagai: Anggota Tahun: 2000 - 2003', 'Penasehat Ahli Kapolri Sebagai: Penasehat Tahun: 1999 - 2014', 'Konsultan PT Arun Sebagai: Tahun: 1989 - 1994', 'Kadin Indonesia Komite Cina Sebagai: Staf Ahli Tahun: 1985 - 1986', 'Penasehat Presiden Urusan Aceh Sebagai: Penasehat Tahun: - '], 'Organizational': ['BAKOM PKB Sebagai: Ketua Tahun: 1990 - 1995', 'PPI & IASI Jerman Sebagai: Ketua Tahun: 1976 - 1982', 'Ketua Warga SMP & Ketua Osis SMA Sebagai: Tahun: 1965 - 1968', 'KAPPI Daerah Itimewa Aceh Sebagai: Ketua Tahun: - 1968'], 'Movement': ['KAPPI Aceh - Ketua Tahun: - 1968'] } # 分离普通字段和嵌套字段 base_fields = {k: v for k, v in data_dict.items() if not isinstance(v, list)} list_fields = {k: v for k, v in data_dict.items() if isinstance(v, list)} # 生成规范化的记录 rows = [] for field_name, items in list_fields.items(): for item in items: row = base_fields.copy() row['Category'] = field_name row['Detail'] = item rows.append(row) df = pd.DataFrame(rows) df.to_csv('politician_normalized.csv', index=False, encoding='utf-8')
生成的CSV结构示例:
| ID | Name | Faction | Constituency | Category | Detail |
|---|---|---|---|---|---|
| 1 | PROF DR BACHTIAR ALY MA | National Democrat Party Faction | ACEH I | Educational Background | Sekolah Rakyat Tahun: - 1963 |
| 1 | PROF DR BACHTIAR ALY MA | National Democrat Party Faction | ACEH I | Educational Background | SMPN 1 Banda Aceh Tahun: - 1965 |
优点:符合数据库规范化设计,方便后续数据分析;缺点:会增加记录行数,不适合单纯查看整体信息。
你可以根据自己的需求选:如果只是存档查看,选方案1/2;如果要做数据分析,选方案3。
内容的提问来源于stack exchange,提问作者Jefferson Ng
相关产品推荐
相关产品推荐

