Скажем, у меня есть список, содержащий символы табуляции:
mylist = [['line 1', '<a href = "//<% serverNames[0].getHostname() %>:'],
['line 2', ' <% master.getConfiguration()>']]
Когда я сохраняю список в файл CSV, tab в коде в строке 2 будет записан как \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)
Как решить такую проблему?
Можете ли вы попробовать заменить ' ' на \t в mylist[1]
Нет, не могу. Пробовал заменить с помощью mylist[1].replace("\t",' '). Оно работает!! \t был удален, но по сравнению с другим списком, содержащим вкладки, предполагается, что он отличается. Должно быть похоже.
попробуйте mylist[1].replace(' ',"\t")






Я не могу воспроизвести точную ошибку ни в Python2, ни в Python3, но у меня есть предположение о том, что происходит с мощь.
Согласно документации на csv.writer, расположен здесь,
All other non-string data are stringified with str() before being written.
Кроме того, обратите внимание, что функция python str вызывает именно то поведение, которое вы описываете, если вы предоставляете строку, содержащую фактический символ табуляции:
>>> str(' ')
'\t'
Конечно, у вас есть строковые данные, но, но в документации выше на самом деле не говорится, что означает Другие. Вот что я нашел в реализации writerows в _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 в тесте, отправляется через str (называемый PyObject_Str в коде C. ), и, следовательно, получает встроенную escape-последовательность.
Так что вы можете проверить, как эти данные попадают в ваши списки.
В качестве альтернативы, возможно, источник, на который я смотрю, не соответствует версии Python, которую вы используете, и вы используете версию, которая, скажем, просто запускает все через str.
Не удалось воспроизвести это. вывод на моей машине без \ t.