CSV转JSON脚本

7 投票
5 回答
14012 浏览
提问于 2025-04-15 16:53
print out

我从这里拿到了这个脚本:

import csv
from itertools import izip
f = open( '/django/sw2/wkw2/csvtest1.csv', 'r' )
reader = csv.reader( f )
keys = ( "firm_url", "firm_name", "first", "last", "school", "year_graduated" )
out = []
for property in reader:
    property = iter( property )
    data = {}
    for key in keys:
        data[ key ] = property.next()
    out += [ data ]
print out

当我在IDLE中运行它时,出现了错误

Traceback (most recent call last):
  File "<pyshell#13>", line 5, in <module>
    data [key] = property.next()
StopIteration

但我又试了一次,然后它打印出了

[{'school': 'The George Washington University Law School', 'last': 'Abbas', 'firm_url': 'http://www.whitecase.com/aabbas', 'year_graduated': ' 2005', 'firm_name': 'White & Case', 'first': ' Amr A '}, {'school': 'Ernst Moritz Arndt University Greifswald', 'last': 'Adam', 'firm_url': 'http://www.whitecase.com/kadam', 'year_graduated': ' 2004', 'firm_name': 'White & Case', 'first': ' Karin '}, {'school': 'Tashkent State Law Institute', 'last': 'Adjivefayev', 'firm_url': 'http://www.whitecase.com/vadjivefayev', 'year_graduated': ' 2002', 'firm_name': 'White & Case', 'first': ' Vilen '}]

但是当我尝试把它当作脚本运行时,它就不工作了,我又收到了同样的错误信息。

有没有人能帮我解决这个错误?

(它输出的json格式有效吗?)

谢谢

编辑

感谢大家的回答。看起来这并不是将csv文件转换为json格式的正确方法。我只是想把包含数据的csv文件转换一下,这样我就可以用loaddata来填充我的django中的sqlite3数据库。请查看django小组中的这个讨论:http://groups.google.com/group/django-users/browse_frm/thread/a00b529ba2147d91,这是我尝试使用csv2json.py代码片段的情况。今天在OS上还有另一个讨论(抱歉我不能提供两个链接)。我希望能有一个简单的方法来将csv转换为json。或者你们用来填充django数据库的方法,我也想知道。谢谢大家的帮助。

5 个回答

2

在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、文件或者网络请求。为了让程序能够理解这些数据,我们通常会把它们转换成一种统一的格式。

比如说,假设我们有一个用户输入的字符串,这个字符串可能包含一些我们不需要的空格或者特殊字符。为了让程序更好地处理这个字符串,我们可以先把它清理一下,去掉多余的空格,或者把所有字母都变成小写。这样做的好处是,后续的处理会更加简单和准确。

在这个过程中,我们可能会用到一些函数或者方法来帮助我们完成这些操作。比如,有的编程语言提供了专门的函数来去掉字符串两端的空格,或者把字符串转换成小写。使用这些工具,可以让我们的代码更加简洁,也能减少出错的机会。

总之,处理数据时,清理和转换是非常重要的一步,它能帮助我们确保数据的质量,从而让程序运行得更加顺利。

import csv
import json
reader = csv.reader(f, delimiter=',', quotechar='"')
keys = next(reader) #skip the headers  
out = [{key: val for key, val in zip(keys, prop)} for prop in reader]
json.dumps(out)
3

使用CSV模块,你已经有一个内置的字典读取器了!下面是一个可以用作命令行工具的示例脚本:

import csv
import json

def csvToJson( inFile, outFile ):
    out = None;

    with open( inFile, 'r') as csvFile:
        #Note this reads the first line as the keys we can add specific keys with:
        #csv.DictReader( csvFile, fieldnames=<LIST HERE>, restkey=None, restval=None, )
        csvDict = csv.DictReader( csvFile, restkey=None, restval=None, )
        out = [obj for obj in csvDict]

    if out:
        with open( outFile, 'w' ) as jsonFile:
            jsonFile.write( json.dumps( out ) );
    else:
       print "Error creating csv dict!"

if __name__ == "__main__":
     import argparse

     parser = argparse.ArgumentParser()
     parser.add_argument('inFile', nargs=1, help="Choose the in file to use")
     parser.add_argument('outFile', nargs=1, help="Choose the out file to use")
     args = parser.parse_args()
     csvToJson( args.inFile[0] , args.outFile[0] );
14

把里面的 for 循环改成:

out = [dict(zip(keys, property)) for property in reader]

另外,print out 不会输出有效的 JSON 格式——应该用 print json.dumps(out)(当然你还需要 import json,这个是 Python 2.6 的标准库模块,不过如果你用的是 2.5 版本,也可以找到适用的版本)。

撰写回答