如何将 INI 文件转换为 CSV 文件

tee*_*ubb 3 python csv bash ini export-to-csv

我想从数据列表创建一个 csv,但列表部分之间的键值不同。该列表具有以下布局:

[Game 1]
Publisher=
Developer=
Released=Nov, 2005
Systems=
Genre=Action|Strategy
Perspective=3rd-Person Perspective
Score=4.5
Controls=
Players=
Rating=
Url=http://www.google.com.pl
Description=This cartridge contains six of the 1 kilobyte e......

[Game 2]
Publisher=Home Entertainment Suppliers Pty. Ltd.
Developer=Imagic
Released=1992
Systems=
Genre=Action
Perspective=3rd-Person Perspective
Score=1.5
Controls=Joystick (Digital)|Same/Split-Screen Multiplayer
Players=1-2 Players
Rating=
Url=http://www.google.com
Description=An unlicensed multi-cart from the Australian-bas.....
Goodname=2 Pak Special - Alien Force & Hoppy
NoIntro=
Tosec=2 Pak Special Light Green - Hoppy & Alien Force
Run Code Online (Sandbox Code Playgroud)

完整文件在这里

每组数据由 [Game *] 分隔,并且对于某些游戏,每个游戏呈现的值可以为空或不存在,例如游戏 1 中缺少 Goodname=、NoIntro= 和 Tosec=。我不知道总数所需的键/列数。理想情况下,我希望每个游戏都在 csv 文件中的单独一行中。

任何人都对如何将这种格式的数据转换为 csv 有任何想法?我难住了。我熟悉 bash 和 python,但我愿意接受有关如何自动化转换的任何建议。

提前致谢。

Art*_*les 5

在 Python 中,您可以使用ConfigParser库读取INI 文件,使用csv库写入逗号分隔文件。我在下面写了一个小脚本ini2csv.py,您可以使用以下命令处理转换:

cat atari.ini | ./ini2csv.py > atari.csv
Run Code Online (Sandbox Code Playgroud)

这是脚本:

#!/usr/bin/python
# encoding: utf-8

import sys
import csv
from ConfigParser import ConfigParser

ini = ConfigParser()
ini.readfp(sys.stdin)

#Find all keys in the INI file to build a row template and 
#include a "game" field to store the section name.
rowTemplate = {"game":""} 
for sec in ini.sections():
   for key,value in ini.items(sec):
       rowTemplate[key] = "" 

#Write the CSV file to stdout with all fields in the first line
out = csv.writer(sys.stdout)
out = csv.DictWriter(sys.stdout, fieldnames=rowTemplate.keys())
out.writeheader()

#Write all rows
for sec in ini.sections():
   row = rowTemplate.copy()
   row["game"] = sec
   for key,value in ini.items(sec):
       row[key] = value
   out.writerow(row)
Run Code Online (Sandbox Code Playgroud)

我使用您在问题中提供的链接对其进行了测试,它似乎按预期工作。