Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python csv编写器:“;“未知方言”;错误_Python_Csv_Writer - Fatal编程技术网

Python csv编写器:“;“未知方言”;错误

Python 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

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

您需要指定字符串的格式:

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,而是将原始字符串解析为正确的列数)。