Python csv编写器:“;“未知方言”;错误
我有一个CSV格式的非常大的字符串,它将被写入CSV文件 我尝试使用最简单的python脚本将其写入CSVPython csv编写器:“;“未知方言”;错误,python,csv,writer,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/53
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()方法可以使用它?您需要指定字符串的格式:
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"
"A","bunch+of","multiline","CSV,LIKE,STRING"
如果要引用所有列值,请将quoting=csv.quote_all
添加到writer对象;然后,您的文件将具有:
A,bunch+of,multiline,"CSV,LIKE,STRING"
"A","bunch+of","multiline","CSV,LIKE,STRING"
要将引号更改为
”
,请将quotechar=“”
添加到writer对象。上述代码未提供它所需的csv.writer.writerows
输入。具体而言:
resultArray = results.split('\n')
这将创建一个字符串列表。然后,将每个字符串传递给writer,并告诉writerows:
for row in resultArray:
writer.writerows(row)
但是writerows
不需要单个字符串。从文档中:
csvwriter.writerows(行)
将所有行
参数(如上所述的行对象列表)写入编写器的文件对象,并根据当前方言进行格式化
因此,您将字符串传递给一个方法,该方法期望其参数为行对象列表,其中行对象本身应为字符串或数字序列:
行必须是写入器对象的字符串或数字序列
您确定列出的示例代码准确地反映了您的尝试吗?虽然它肯定不会工作,但我希望生成的异常会有所不同
对于一个可能的解决方案-如果您只想将一个大字符串写入一个文件,那么您根本不需要csv
库。您可以直接编写字符串。即使在换行符上进行拆分也是不必要的,除非您需要用DOS样式的换行符替换Unix样式的换行符
如果您毕竟需要使用
csv
模块,那么您需要给您的编写器一些它能理解的东西-在本例中,这类似于writer.writerow(['A','bunch+of','multiline','csv,like,STRING'])
。注意,这是一个真正的Python字符串列表。如果您需要将原始字符串“'A'、'bunch+of'、'multiline'、'CSV,LIKE,string'
转换为这样一个列表,我想您会发现CSV
库对读者很有用-无需重新发明轮子来处理子字符串“CSV,LIKE,string”中引用的逗号。在这种情况下,您需要注意您的方言。您可以使用“register\u dialogue”:
例如,对于转义格式:
csv.register_dialect('escaped', escapechar='\\', doublequote=True, quoting=csv.QUOTE_ALL)
不一定
writer
默认使用excel
方言,一般来说应该可以。我认为问题在于输入错误。resultsArray
是否像您想象的那样被拆分?@PeterDeGlopper excel方言中的引号是“
,并将引号设置为最小值,这与输入字符串不同。此外,示例字符串只是一个示例。我拥有的原始字符串是巨大的。大约14000行长,每行有7个字段。因此,我将每一行作为一行写入csv,但编写器并不关心输入字符串的方言。如果OP在编写之前使用csv库将其引用的字符串转换为列表(我预计他最终将不得不这样做),那么方言设置将非常重要。但是,即使是一个包含许多需要转义的字符的字符串,也可以通过任何方言传递给编写器,只要您以预期的数据结构将其传递给编写器(例如,当它需要一系列字符串时,不只是一个字符串)。我在原始字符串中添加了几行,如果这可能有帮助。@SpikETidE-假设三引号字符串中的换行符是原始字符串中的\n
字符,并且您的结束语“不+不”实际上有一个与“
字符分开的结束语”,我希望大多数支持csv的工具能够只打开f.write(results)
的结果。你需要进行什么样的清理?这就是问题所在。。!如果您看到第三行,则有以下字段:“Could+not:+{“url”:“/all.json?status=正在进行、已计划、冲突”,“code”:0,“data”:“success”:false,“error”:true,“cached”:false,“jqXhr”:{“readyState”:0,“responseText”:“status”:0,“statusText”:“error”}“此字段有”,'与转义中字段之间的分隔符相同'" '. 如果我使用f.write方法,Excel错误地截断了此字段。所以我需要使这个csv兼容,使它正常工作。是的,我看到了,一旦你在第三行编辑。一旦您在其他双引号中嵌套了双引号,并且您希望解析器能够处理这些双引号,那么您就遇到了一个非常复杂的问题。我不希望csv
库能够帮助您实现这一点——如果我正确地记住了我的计算理论,那么只有递归解析器才能处理这种任意嵌套的定界符。如果你能以任何方式控制你的输入,你应该。如果你做不到,你就有一团乱麻要处理。这正是我所担心的。我无法控制输入。您可以手动将字符串拆分为输出中所需的列数吗?这样就可以处理真正的问题(不是写出csv,而是将原始字符串解析为正确的列数)。