【问题标题】:CSV to JSON scriptCSV 到 JSON 脚本
【发布时间】:2010-12-25 11:00:22
【问题描述】:

这个脚本来自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 sn-p。今天在 OS 中的另一个线程(抱歉,我不能包含 2 个链接)。我很欣赏将 csv 转换为 json 的简单方法。或者您用来填充我应该使用的 django 数据库的方法。感谢您的帮助。

【问题讨论】:

标签: python json csv


【解决方案1】:

将嵌套的for 循环更改为:

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

而且,不,print out 不会发出有效的 JSON——使用print json.dumps(out)(当然你也需要import json——这是一个 Python 2.6 标准库模块,但你可以找到使用 2.5 的版本如果这是你需要的)。

【讨论】:

  • 谢谢!这行得通。但是我不能对那个文件使用 loaddata。在我尝试更多的东西之后,我会单独询问。
  • +1 这是一段不错的代码。我很快就会用这个想法偷走^h^h^h^h^h。
【解决方案2】:

使用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] );

【讨论】:

    【解决方案3】:
    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)
    

    【讨论】:

    • 我真的很喜欢你的解决方案......如果你解释 f 是,对于 python 中的新功能应该会更好:f = open('/path/file', 'r')
    【解决方案4】:

    也许您正试图解析文件末尾的空行

    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" ))
    

    【讨论】:

      【解决方案5】:

      由于您实际上并未创建 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
      

      这样的东西通常效果更好。

      【讨论】:

        猜你喜欢
        • 2011-07-18
        • 2018-08-29
        • 1970-01-01
        • 1970-01-01
        • 2010-10-29
        • 2021-10-23
        • 1970-01-01
        • 2014-04-21
        • 1970-01-01
        相关资源
        最近更新 更多