我从here获取此脚本:
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
但我试过
print out
再次打印
[{'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中的另一个主题(抱歉,我不能包含2个链接)。我很感激将csv转换为json的简单方法。或者您用来填充我应该使用的django数据库的方法。谢谢你的帮助。
答案 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的版本,如果你需要的话。)
答案 1 :(得分:3)
使用CSV Module,您已经内置了dict reader!这是一个可用作命令行工具的示例脚本:
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] );
答案 2 :(得分: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 :(得分:0)
也许您正在尝试解析文件末尾的空行
for property in reader:
print repr(property) # <---try adding a print here
property = iter( property )
csv.DictReader也可以做你想要的事情
csv.DictReader(f,fields=("firm_url", "firm_name", "first", "last", "school", "year_graduated" ))
答案 4 :(得分:0)
由于你实际上并没有创建JSON,我不确定最后一个问题。你只是打印一本Python字典。它们大多是JSON,但并非总是如此。
所以你应该找到一个好的json
模块并使用它。如果你有Python 2.6:http://docs.python.org/library/json.html
此外,csv
有一个字典阅读器,可以更短更容易地使用表单来完成所有这些工作。 http://docs.python.org/library/csv.html#csv.DictReader
编辑。
import csv
from your.app.models import YourClass
with open( "path/to/your/file.csv", "rb" ) as src:
rdr = csv.DictReader( src )
for row in rdr:
x= YourClass.objects.create( field=row['column'], field=row['column'], ... )
x.save()
print x
这样的事情通常会更好。