Запись Escape-символов в CSV-файл на Python - PullRequest
0 голосов
/ 27 сентября 2011

Я использую модуль csv в python, а escape-символы продолжают портить мой csv. Например, если у меня было следующее:

import csv

rowWriter = csv.writer(open('bike.csv', 'w'), delimiter = ",")

text1 = "I like to \n ride my bike"
text2 = "pumpkin sauce"

rowWriter.writerow([text1, text2])
rowWriter.writerow(['chicken','wings'])

Я бы хотел, чтобы мой CSV выглядел так:

I like to \n ride my bike,pumpkin sauce
chicken,wings

Но вместо этого получается как

I like to
ride my bike,pumpkin sauce
chicken,wings

Я пробовал сочетания кавычек, двойных кавычек, escapechar и других параметров модуля csv, но я не могу заставить его работать. Кто-нибудь знает, что с этим?

* Примечание. Я также использую кодировку кодеков ("utf-8"), поэтому text1 действительно выглядит как "I like to \n ride my bike".encode("utf-8")

Ответы [ 2 ]

3 голосов
/ 27 сентября 2011

Проблема не в записи их в файл.Проблема в том, что \n - это разрыв строки, когда он внутри '' или "".Что вам действительно нужно, так это 'I like to \\n ride my bike' или r'I like to \n ride my bike' (обратите внимание на префикс r).

0 голосов
/ 28 сентября 2011

Во-первых, не очевидно, почему вы хотите, чтобы r"\n" (два байта) появлялся в вашем файле вместо "\n" (один байт). Для чего предназначен потребитель выходного файла? Использовать ast.evaluate_literal() в каждом поле ввода? Если ваши фактические данные содержат какие-либо из символов (не ASCII, апострофов, кавычек), то я бы очень осторожно их сериализировал, используя repr().

Во-вторых, вы неверно сообщили либо свой код, либо свой вывод (или оба). Код, который вы показываете, на самом деле производит:

"I like to
 ride my bike",pumpkin sauce
chicken,wings

В-третьих, о вашем "I like to \n ride my bike".encode("utf-8"): str_object.encode("utf-8") абсолютно бессмысленно, если str_object содержит только байты ASCII - он ничего не делает. В противном случае это вызывает исключение.

В-четвертых, этот комментарий:

Мне больше не нужно вызывать кодирование, теперь, когда я использую raw строка. Есть много символов Юникода в тексте, который я используя, поэтому, прежде чем я начал использовать необработанную строку, я использовал кодировать так что CSV может читать текст Unicode

не имеет никакого смысла - как я уже сказал, "ascii string".encode('utf8') бессмысленно.

Подумайте о том, чтобы сделать шаг на два назад и объясните, что вы действительно пытаетесь сделать: откуда берутся ваши данные, что в них, и, самое главное, что будет делать процесс, который собирается прочитать файл.

...