LPTHW:CSV.writer

时间:2015-12-24 18:03:54

标签: python

在浏览LPTHW时,我已经开始在这里阅读代码了:

https://github.com/BrechtDeMan/secretsanta/blob/master/pairing.py

我一直在努力理解为什么输出CSV有双引号。这里有几个关于这个问题的问题,但我并没有动摇。

报价在哪里引入?

编辑:几周前我写了作者,但没有收到回复。

编辑2:输出的一个例子......

"Alice,101,alice@mail.org,Wendy,204,wendy@mail.org"

2 个答案:

答案 0 :(得分:5)

angular.module('plunker', []) .controller('AnimateCtlr', function($scope){ $scope.data = ['apple', 'orange', 'banana', 'grapes', 'lemon', 'strawberry']; $scope.filteredData = []; }) .directive('basicInputFilter', function($filter){ var linker = function (scope, element, attrs) { element.on('input', function(event, combo, selection){ var expression = $(this).text(); expression = scope.filter; console.log(expression); scope.$apply(function(){ scope.filteredData = $filter('filter')(scope.data, expression); }); }); }; return { restrict: 'A', link: linker, scope: { data:'=', filteredData:'=', filter: '=' } }; }); 函数中引入了双引号。

CSV文件在表面上看起来很简单,但迟早会遇到一些更复杂的问题。第一个是:如果在字段内容中出现字符表示分隔符,会发生什么?由于CSV格式没有真正的标准,不同的人对这个问题有正确答案的不同想法。

Python write_file库试图抽象出这种复杂性和各种方法,并使遵循不同规则的CSV文件更容易阅读和编写。这是由Dialect class个对象完成的。

csv函数的作者决定通过将所有字段和分隔符连接在一起来手动构造输出行,但随后使用write_file模块将数据实际写入文件:

csv

writer.writerow([givers_list[ind][1] + ',' + givers_list[ind][2] + ',' + givers_list[ind][3] + ',' + givers_list[rand_vec[ind]][1] + ',' + givers_list[rand_vec[ind]][2] + ',' + givers_list[rand_vec[ind]][3]]) 模块的这种不一致使用导致整行数据被视为单个字段。由于该字段包含用作字段分隔符的字符,因此csv决定如何处理它。默认引用配置Dialect.quoting表示应使用csv.QUOTE_MINIMAL引用该字段 - 默认为双引号字符(Dialect.quotechar)。这就是为什么最终整个字段最终被双引号字符所包围的原因。

快速而简单但不正确的解决方案是将引用算法更改为"。这将告诉writer对象永远不会包围字段,而是通过csv.QUOTE_NONE转义特殊字符。根据文档,将其设置为Dialect.escapechar(默认)将引发错误。我想将它设置为空字符串可以完成这项工作。

正确的解决方案是向None提供预期的输入数据 - 字段列表。这应该(未经测试):

writer.writerrow

答案 1 :(得分:2)

一般情况下,当字段中存在分隔符时,需要(双)引号 - 如果该字段内有引号,则需要对其进行转义'另一个引用。

您是否有输出的例子和您正在谈论的报价?

修改(示例后):

好的,这整行被视为一个字段。正如Miroslaw Zalewski所提到的那样,这些值应该被视为单独的字段而不是一个长字符串。