为什么使用python将标签写入CSV文件中?

时间:2018-04-02 02:48:12

标签: python list csv tabs space

假设我有一个列表包含标签字符:

mylist = [['line 1', '<a href="//<% serverNames[0].getHostname() %>:'],
          ['line 2', '     <% master.getConfiguration()>']]

当我将列表保存到CSV文件中时,第2行代码中的tab将写为\t

line | code
-----------------------------------------------------
   1 | <a href="//<% serverNames[0].getHostname() %>:
   2 | \t   <% master.getConfiguration()>

我需要它,因为我想将代码与其他列表进行比较。因此,我不想将标签替换为其他字符,例如空格。

我写的代码:

with open('codelist.csv', 'w') as file:
   header = ['line','code']
   writers = csv.writer(file)
   writers.writerow(header)
   for row in mylist:
      writers.writerow(row)

如何解决这类问题?

1 个答案:

答案 0 :(得分:2)

我无法在Python2或Python3中重现确切的错误,但我猜测可能正在进行什么。

根据csv.writerlocated here

的文档
  

所有其他非字符串数据在写入之前用str()进行字符串化。

另外请注意,如果提供包含实际制表符的字符串,则python str函数会精确地引出您描述的行为:

 >>> str('  ')
 '\t'

当然,你所拥有的是字符串数据,但是,上面的文档并没有真正说出其他的含义。这是我在writerowslocated here_csv.c的实施中发现的内容:

    if (PyUnicode_Check(field)) {
        append_ok = join_append(self, field, quoted);
        Py_DECREF(field);
    }
    else if (field == Py_None) {
        append_ok = join_append(self, NULL, quoted);
        Py_DECREF(field);
    }
    else {
        PyObject *str;

        str = PyObject_Str(field);
        Py_DECREF(field);
        if (str == NULL) {
            Py_DECREF(iter);
            return NULL;
        }
        append_ok = join_append(self, str, quoted);
        Py_DECREF(str);
    }

所以我怀疑这里发生的是你的列表以某种方式包含字符串数据,这种格式不被识别为unicode字符串,因此导致PyUnicode_Check分支失败。 test,通过str(在C代码中称为PyObject_Str)发送,然后嵌入转义序列。

因此,您可能想要检查数据是如何进入列表的。

或者,也许我在那里查看的来源与您正在使用的Python版本不对应,并且您正在使用的版本,例如,只是运行<\ n \ n em>所有到str