假设我有一个列表包含标签字符:
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)
如何解决这类问题?
答案 0 :(得分:2)
我无法在Python2或Python3中重现确切的错误,但我猜测可能正在进行什么。
根据csv.writer
,located here,
所有其他非字符串数据在写入之前用str()进行字符串化。
另外请注意,如果提供包含实际制表符的字符串,则python str
函数会精确地引出您描述的行为:
>>> str(' ')
'\t'
当然,你所拥有的是字符串数据,但是,上面的文档并没有真正说出其他的含义。这是我在writerows
,located 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
。