Python csv writer:“Unknown Dialect”错误

时间:2013-12-04 07:22:09

标签: python csv writer

我有一个非常大的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()方法可以使用它?

3 个答案:

答案 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)