Python 解析CSV文件,并将其写入另一种CSV格式

Python 解析CSV文件,并将其写入另一种CSV格式,python,csv,Python,Csv,使用urllib2获取并放入文件夹的my import CSV格式如下: number,season,episode,production code,airdate,title,special?,tvrage 1,1,1,"101",24/Sep/07,"Pilot",n,"http://www.tvrage.com/Chuck/episodes/579282" 现在,我成功地将其转换为SQL语句以及另一个可以插入数据库的CSV文件。转换成这样的格式: ,1,1,1,"Pilot",'2006

使用urllib2获取并放入文件夹的my import CSV格式如下:

number,season,episode,production code,airdate,title,special?,tvrage
1,1,1,"101",24/Sep/07,"Pilot",n,"http://www.tvrage.com/Chuck/episodes/579282"
现在,我成功地将其转换为SQL语句以及另一个可以插入数据库的CSV文件。转换成这样的格式:

,1,1,1,"Pilot",'2006-10-11',,,,,1,2011-12-23 15:52:49,2011-12-23 15:52:49,1,1
使用以下代码

csv = """,%s,%s,%s,%s,%r,,,,,1,2011-12-23 15:52:49,2011-12-23 15:52:49,1,1""" % (showid, line[1],line[2], line[5], date(line[4]))
    print>>final, csv
编辑-

我已将字符串格式更改为:

csv = ','+showid+','+line[1]+','+line[2]+','+line[5]+','+date(line[4])+',,,,,1,2011-12-23 15:52:49,2011-12-23 15:52:49,1,1'
这并没有好多少,我仍然有一些文件在解析时被跳过的问题。不确定是me还是CSV模块

问题是它可以很好地浏览一些文件。有些CSV文件它只是跳过,有些我只是得到了一些错误,比如IndexError:list index超出范围

如果有人有CSV文件的经验,并让他们正确解析,我将非常感谢您的帮助

以下是完整的源代码:

dsimport.py- CSVFileHandler.py-


谢谢

我不确定所有错误到底是什么,但这里有一些提示:

  • processFile(line),
    line
    是一个不好的名字,因为它不是一个字符串行,而是一个
    或元素列表。这也是蒂姆和我一见钟情的地方
  • 您应该验证
    是否具有脚本所需的至少6个元素
  • 您可以使用非常棒的
    join
    方法
  • 下面是一个小的重构:

    def processFile(row):
        if len(row) < 6:
            #raise Exception('too few columns')
            # maybe it's better to just ignore bad rows in your case
            return
        items = [
            '',
            showid,
            row[1],
            row[2],
            row[5],
            date(row[4]),
            ]
        res = ','.join(items)
        res += ',,,,,1,2011-12-23 15:52:49,2011-12-23 15:52:49,1,1'
        print res
        print>>final, res
    
    handler = CSVFileHandler('/Users/tharshan/WebRoot/stv/export/csv/%s-save.csv' % name)
    try:
        handler.process(processFile, name)    
    except Exception, e:
        print 'Failed processing and skipping %s because of: %s' % (name, e)
    
    final.close()
    
    def进程文件(行):
    如果长度(世界其他地区)<6:
    #引发异常(“列太少”)
    #也许在你的情况下,最好忽略不好的行
    返回
    项目=[
    '',
    肖维德,
    第[1]行,
    第[2]行,
    第[5]行,
    日期(第[4]行),
    ]
    res=',join(项目)
    res+=,,,,12011-12-2315:52:492011-12-2315:52:49,1,1'
    打印资源
    打印>>最终版本,res
    handler=CSVFileHandler('/Users/tharshan/WebRoot/stv/export/csv/%s-save.csv“%name”)
    尝试:
    process(processFile,名称)
    除例外情况外,e:
    打印“处理失败并跳过%s,因为:%s%”(名称,e)
    final.close()
    
    我不确定所有错误的确切原因,但这里有一些提示:

  • processFile(line),
    line
    是一个不好的名字,因为它不是一个字符串行,而是一个
    或元素列表。这也是蒂姆和我一见钟情的地方
  • 您应该验证
    是否具有脚本所需的至少6个元素
  • 您可以使用非常棒的
    join
    方法
  • 下面是一个小的重构:

    def processFile(row):
        if len(row) < 6:
            #raise Exception('too few columns')
            # maybe it's better to just ignore bad rows in your case
            return
        items = [
            '',
            showid,
            row[1],
            row[2],
            row[5],
            date(row[4]),
            ]
        res = ','.join(items)
        res += ',,,,,1,2011-12-23 15:52:49,2011-12-23 15:52:49,1,1'
        print res
        print>>final, res
    
    handler = CSVFileHandler('/Users/tharshan/WebRoot/stv/export/csv/%s-save.csv' % name)
    try:
        handler.process(processFile, name)    
    except Exception, e:
        print 'Failed processing and skipping %s because of: %s' % (name, e)
    
    final.close()
    
    def进程文件(行):
    如果长度(世界其他地区)<6:
    #引发异常(“列太少”)
    #也许在你的情况下,最好忽略不好的行
    返回
    项目=[
    '',
    肖维德,
    第[1]行,
    第[2]行,
    第[5]行,
    日期(第[4]行),
    ]
    res=',join(项目)
    res+=,,,,12011-12-2315:52:492011-12-2315:52:49,1,1'
    打印资源
    打印>>最终版本,res
    handler=CSVFileHandler('/Users/tharshan/WebRoot/stv/export/csv/%s-save.csv“%name”)
    尝试:
    process(processFile,名称)
    除例外情况外,e:
    打印“处理失败并跳过%s,因为:%s%”(名称,e)
    final.close()
    
    无需担心所有问题都已解决。最后,我只使用了excel方言,并用管道输出了csv。不管是哪种方式,它都相当烦琐,老实说,我觉得它完全是靠运气完成的


    谢谢你的帮助。

    不用担心,所有问题都解决了。最后,我只使用了excel方言,并用管道输出了csv。不管是哪种方式,它都相当烦琐,老实说,我觉得它完全是靠运气完成的


    谢谢你的帮助。

    你看过地图了吗?如果是这样,你为什么不使用它呢?是的,我使用的是CSV模块,只是有一些奇怪的异常。如果你手动粘贴CSV“字符串”,你显然没有使用CSV模块。我已经包括了源代码,它只是我使用的2个文件。我使用的是CSV模块,它只用于获取导入和更改一些值。您看过了吗?如果是这样,你为什么不使用它呢?是的,我使用的是CSV模块,只是有一些奇怪的异常。如果你手动粘贴CSV“字符串”,你显然没有使用CSV模块。我已经包括了源代码,它只是我使用的2个文件。我正在使用CSV模块,这只是为了获取导入和更改一些值。谢谢,这些是一些非常好的错误捕获技巧。然而,我仍然遇到了一个问题,CSV文件已经下载到哪里,应该被解析并打印到新文件中,但是它只是被跳过了。该文件中的行未打印到控制台。我只是被难住了,我不知道为什么。而且这些CSV文件会有不同的列号也没有任何意义,因为它们都是以相同的格式从这个网站导出的。示例:如果抛出异常,请列出它们。如果只是“跳过”了文件,那么每次输入main()时都应该尝试打印应该处理的文件名,看看该函数的调用次数是否与计划的次数相同。如果调用
    main()
    的次数足够多,那么。嗯,我刚注意到一些事情。你真的应该在每次附加完文件后(在
    main
    的末尾)关闭该文件。谢谢,我在末尾添加了关闭按钮只是为了更好的衡量。我不确定如何检查main调用的次数是否足够,您的意思是仅仅使用一个简单的计数器吗?看看它是否匹配数组大小?我按照你的建议做了,并看了一下这些打印输出:真的很奇怪,我不明白这些行是怎么可能的。我认为解析器搞砸了,似乎有很多csv文件被跳过了,因为它们的某些地方列太少了。也许你应该跳过那些列太少的行。我更新了我的解决方案。谢谢,这些是