使用列作为键将Python的CSV文件转换为JSON

4

请帮帮我,我不想从CSV文件中打印标题。

csvfile = open('testdata.csv', 'rU')
jsonfile = open('brofile.json', 'w')

fieldnames = {'Matric':[("studentName","dept","status")]}

reader = csv.DictReader( csvfile, fieldnames)

for row in reader:
    json.dump(row, jsonfile)
    jsonfile.write('\n')

预期输出
[2010CS01: { "Jones Doe", "Computer science", "paid"}]
[2010CS02: {"James Rug", "Computer Science", "Paid"}]
[2010AC01: {"Curtis Payne", "Accounting", "unpaid"}]

CSV文件:

Matric         Name            Department            Status
2010CS01       Jones Doe       Computer Science      Paid 
2010CS02       James Rug       Computer Science      Paid 
2010AC01       Curtis Payne    Accounting            Unpaid 

我投票关闭此问题,因为SO不是一个代码编写服务。 - bruno desthuilliers
你尝试过什么了吗? - bruno desthuilliers
预期输出不是有效的 JSON。 - Duncan
2个回答

1

在将文件传递给csv-reader之前,您可以使用csvfile.readline()读取文件中的第一行。这将使文件描述符移动到第二行(您可以使用csvfile.tell()检查位置),从而应在输出中省略标题。

csvfile.readline()
reader = csv.DictReader(csvfile, fieldnames)

更新:

如我评论中所提到的,您的输入数据存在问题:没有明确的分隔符来标记列之间的边界(至少在您发布的数据中只有空格)。如果使用逗号作为分隔符,一切都会顺利进行:

数据:

Matric,Name,Department,Status
2010CS01,Jones Doe,Computer Science,Paid
2010CS02,James Rug,Computer Science,Paid
2010AC01,Curtis Payne,Accounting,Unpaid

代码:

import csv, json

csvfile = open('testdata.csv', 'rU')
jsonfile = open('testdata.json', 'w')

reader = csv.DictReader(csvfile)

for row in reader:
    json.dump({ row['Matric'] : (row['Name'], row['Department'], row['Status']) }, jsonfile)
    jsonfile.write('\n')

输出:

{"2010CS01": ["Jones Doe", "Computer Science", "Paid"]}
{"2010CS02": ["James Rug", "Computer Science", "Paid"]}
{"2010AC01": ["Curtis Payne", "Accounting", "Unpaid"]}

像其他评论所述,您期望的输出不是有效的JSon。这个输出是。

转换输入数据

假设您的输入数据实际上是由制表符分隔的,在您发布它们时已经转换为空格,您可以在解析csv时简单地指定制表符作为分隔符:

reader = csv.DictReader(csvfile, delimiter='\t')

如果您的输入数据确实只包含空格,则可以使用简单的sed将多个空格转换为逗号:
sed -e 's/\ \{2,\}/,/g' -i testdata.csv

不能保证这会起作用 - 如果您的数据字段中有多个空格,它会破坏一切。


拥有相同的东西...它没有给我想要的实际格式。 - Payne
我明白了... 我自己试着运行了一下,发现标题已经被剥离了,但你得到错误的输出是因为你的输入有误。你正在解析一个 CSV(逗号分隔值),它实际上并不包含逗号。你需要指定一个分隔符,来分隔单个列。你的输入数据中是否包含制表符或者全部都是空格? - andreas-hofmann
非常感谢你,我很欣赏你。你为我的发展做出了贡献。祝福你。 - Payne

1
要忽略csv文件的第一行,请在reader上调用next()函数:
reader = next(reader, None) 

谢谢,但这并没有解决问题。格式仍然不规则。 - Payne
正如之前的评论所说,您期望的输出不是有效的json格式。而您所说的格式仍然不规则是什么意思?您说您不想打印标题,但我给出的代码确实这样做了。请编辑您的问题或提出另一个问题。 - arainone
谢谢,我已经把它结构化了。非常感谢。 - Payne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接