我有一个非常大的CSV格式字符串,将写入CSV文件。
我尝试使用最简单的python脚本
将其写入CSV results=""" "2013-12-03 23:59:52","/core/log","79.223.39.000","logging-4.0",iPad,Unknown,"1.0.1.59-266060",NA,NA,NA,NA,3,"1385593191.865",true,ERROR,"app_error","iPad/Unknown/webkit/537.51.1",NA,"Does+not",false
"2013-12-03 23:58:41","/core/log","217.7.59.000","logging-4.0",Win32,Unknown,"1.0.1.59-266060",NA,NA,NA,NA,4,"1385593120.68",true,ERROR,"app_error","Win32/Unknown/msie/9.0",NA,"Does+not,false
"2013-12-03 23:58:19","/core/client_log","79.240.195.000","logging-4.0",Win32,"5.1","1.0.1.59-266060",NA,NA,NA,NA,6,"1385593099.001",true,ERROR,"app_error","Win32/5.1/mozilla/25.0",NA,"Could+not:+{"url":"/all.json?status=ongoing,scheduled,conflict","code":0,"data":"","success":false,"error":true,"cached":false,"jqXhr":{"readyState":0,"responseText":"","status":0,"statusText":"error"}}",false"""
resultArray = results.split('\n')
with open(csvfile, 'wb') as f:
writer = csv.writer(f)
for row in resultArray:
writer.writerows(row)
代码返回
“未知方言”
错误
由于脚本是错误还是由于正在写入的字符串?
如果问题输入不好,我该如何清理它以便csv.writer()方法可以使用它?
答案 0 :(得分:3)
您需要指定字符串的格式:
with open(csvfile, 'wb') as f:
writer = csv.writer(f, delimiter=',', quotechar="'", quoting=csv.QUOTE_ALL)
您可能还想重新访问您的写作循环;你编写它的方式将在你的文件中得到一列,每行将是结果字符串中的一个字符。
要真正利用该模块,请尝试以下方法:
import csv
lines = ["'A','bunch+of','multiline','CSV,LIKE,STRING'"]
reader = csv.reader(lines, quotechar="'")
with open('out.csv', 'wb') as f:
writer = csv.writer(f)
writer.writerows(list(reader))
out.csv
将有:
A,bunch+of,multiline,"CSV,LIKE,STRING"
如果要引用所有列值,则将quoting=csv.QUOTE_ALL
添加到writer对象;然后你的文件将有:
"A","bunch+of","multiline","CSV,LIKE,STRING"
要将引号更改为'
,请将quotechar="'"
添加到编写器对象。
答案 1 :(得分:1)
上面的代码没有给出它期望的csv.writer.writerows
输入。具体做法是:
resultArray = results.split('\n')
这会创建一个字符串列表。然后,将每个字符串传递给作者并将其告诉写作者:
for row in resultArray:
writer.writerows(row)
但writerows
不期望单个字符串。来自文档:
csvwriter.writerows(行)
将所有
rows
参数(如上所述的行对象列表)写入编写器的文件对象,并根据当前方言进行格式化。
因此,您将字符串传递给一个方法,该方法要求其参数为行对象列表,其中行对象本身应为字符串或数字序列:
一行必须是Writer对象的字符串或数字序列
您确定列出的示例代码是否准确反映了您的尝试?虽然它肯定不起作用,但我认为产生的例外是不同的。
对于可能的修复 - 如果您要做的只是将大字符串写入文件,则根本不需要csv
库。你可以直接写字符串。除非你需要做一些像用DOS风格的换行替换Unix风格的换行,否则甚至不需要拆分新行。
如果你需要使用csv
模块,你需要给你的作家一些它理解的东西 - 在这个例子中,就像writer.writerow(['A','bunch+of','multiline','CSV,LIKE,STRING'])
。请注意,这是一个真正的Python字符串列表。如果你需要将原始字符串"'A','bunch+of','multiline','CSV,LIKE,STRING'"
转换为这样的列表,我想你会发现csv
库对读者很有用 - 不需要重新发明轮子来处理子串中引用的逗号'CSV一样,STRING'。在这种情况下,你需要关心你的方言。
答案 2 :(得分:0)
您可以使用' register_dialect':
例如,用于转义格式:
csv.register_dialect('escaped', escapechar='\\', doublequote=True, quoting=csv.QUOTE_ALL)