Почему вкладки написаны \ t в файле CSV с использованием Python

Скажем, у меня есть список, содержащий символы табуляции:

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.

Morse 02.04.2018 04:54

Можете ли вы попробовать заменить ' ' на \t в mylist[1]

Morse 02.04.2018 05:02

Нет, не могу. Пробовал заменить с помощью mylist[1].replace("\t",' '). Оно работает!! \t был удален, но по сравнению с другим списком, содержащим вкладки, предполагается, что он отличается. Должно быть похоже.

YusufUMS 02.04.2018 05:09

попробуйте mylist[1].replace(' ',"\t")

Morse 02.04.2018 05:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не могу воспроизвести точную ошибку ни в 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.

Другие вопросы по теме