Python 解析CSV文件,并将其写入另一种CSV格式
使用urllib2获取并放入文件夹的my import 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
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-
谢谢我不确定所有错误到底是什么,但这里有一些提示:
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()
我不确定所有错误的确切原因,但这里有一些提示:
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文件被跳过了,因为它们的某些地方列太少了。也许你应该跳过那些列太少的行。我更新了我的解决方案。谢谢,这些是