Pergunta

Ao longo das linhas do meu anterior questão , como posso participar de uma lista de cadeias de caracteres em uma seqüência de tal forma que os valores se citou de forma limpa. Algo como:

['a', 'one "two" three', 'foo, bar', """both"'"""]

em:

a, 'one "two" three', "foo, bar", "both\"'"

Eu suspeito que o módulo csv vai entrar em jogo aqui, mas eu não tenho certeza de como obter o resultado que eu quero.

Foi útil?

Solução

Usando o módulo csv você pode fazer dessa forma:

import csv
writer = csv.writer(open("some.csv", "wb"))
writer.writerow(the_list)

Se você precisar de uma corda só usar instância StringIO como um arquivo:

f = StringIO.StringIO()
writer = csv.writer(f)
writer.writerow(the_list)
print f.getvalue()

A saída: a,"one ""two"" three","foo, bar","both""'"

csv vai escrever de uma forma que ele possa ler mais tarde. Você pode afinar a sua saída através da definição de um dialect, apenas set quotechar, escapechar, etc, conforme necessário:

class SomeDialect(csv.excel):
    delimiter = ','
    quotechar = '"'
    escapechar = "\\"
    doublequote = False
    lineterminator = '\n'
    quoting = csv.QUOTE_MINIMAL

f = cStringIO.StringIO()
writer = csv.writer(f, dialect=SomeDialect)
writer.writerow(the_list)
print f.getvalue()

A saída: a,one \"two\" three,"foo, bar",both\"'

O mesmo dialeto pode ser usado com o módulo CSV para ler a seqüência de volta mais tarde para uma lista.

Outras dicas

Em uma nota relacionada, Python do builtin encoders pode também fazer corda escapar :

>>> print "that's interesting".encode('string_escape')
that\'s interesting

Aqui está uma alternativa um pouco mais simples.

def quote(s):
    if "'" in s or '"' in s or "," in str(s):
        return repr(s)
    return s

Precisamos apenas para citar um valor que pode ter vírgulas ou aspas.

>>> x= ['a', 'one "two" three', 'foo, bar', 'both"\'']
>>> print ", ".join( map(quote,x) )
a, 'one "two" three', 'foo, bar', 'both"\''
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top