Eu tenho uma literal de seqüência de caracteres de várias linhas que eu quero fazer uma operação em cada linha, assim:
inputString = """Line 1
Line 2
Line 3"""
Eu quero fazer algo como o seguinte:
for line in inputString:
doStuff()
inputString.splitlines()
Fornecerá uma lista com cada item; o splitlines()
método foi projetado para dividir cada linha em um elemento da lista.
''.splitlines() == []
, não['']
como com''.split('\n')
.Como os outros disseram:
Isso é idêntico ao acima, mas as funções do módulo de string estão obsoletas e devem ser evitadas:
Como alternativa, se você deseja que cada linha inclua a sequência de interrupção (CR, LF, CRLF), use o
splitlines
método com umTrue
argumento:fonte
inputString.split(os.linesep)
usará o terminador de linha específico da plataforma.Use
str.splitlines()
.splitlines()
lida com as novas linhas corretamente, diferentementesplit("\n")
.Ele também tem a vantagem mencionada por @efotinis de incluir opcionalmente o caractere de nova linha no resultado da divisão quando chamado com um
True
argumento.Explicação detalhada sobre por que você não deve usar
split("\n")
:\n
, em Python, representa uma quebra de linha do Unix (código decimal ASCII 10), independentemente da plataforma em que você a executa. No entanto, a representação de quebra de linha depende da plataforma . No Windows,\n
há dois caracteresCR
eLF
(códigos decimais ASCII 13 e 10, AKA\r
e\n
), enquanto em qualquer Unix moderno (incluindo OS X), é o caractere únicoLF
.print
, por exemplo, funciona corretamente, mesmo que você tenha uma string com terminações de linha que não correspondem à sua plataforma:No entanto, a divisão explícita em "\ n" produzirá um comportamento dependente da plataforma:
Mesmo se você usar
os.linesep
, ele só será dividido de acordo com o separador de nova linha na sua plataforma e falhará se você estiver processando o texto criado em outras plataformas ou com apenas um\n
:splitlines
resolve todos estes problemas:A leitura de arquivos no modo de texto atenua parcialmente o problema de representação de nova linha, pois converte o Python
\n
na representação de nova linha da plataforma. No entanto, o modo de texto existe apenas no Windows. Nos sistemas Unix, todos os arquivos são abertos no modo binário; portanto, o usosplit('\n')
em um sistema UNIX com um arquivo do Windows levará a um comportamento indesejado. Além disso, não é incomum processar seqüências de caracteres com novas linhas potencialmente diferentes de outras fontes, como de um soquete.fonte
splitlines
será dividido em qualquer final de linha.split(os.linesep)
irá falhar ao ler um arquivo do Windows no UNIX, por exemploPode ser um exagero nesse caso específico, mas outra opção envolve o uso
StringIO
para criar um objeto parecido com um arquivofonte
str.split
, não é a necessidade de alocar memória (ele lê a string no local). Uma desvantagem é que é muito mais lento se você usarStringIO
(cerca de 50x). Se você usarcStringIO
, no entanto, é cerca de 2x mais rápidoA postagem original solicitada pelo código que imprime algumas linhas (se forem verdadeiras para alguma condição) mais a seguinte linha. Minha implementação seria esta:
fonte
Gostaria que os comentários tivessem uma formatação de texto de código adequada, porque acho que a resposta do @ 1_CR precisa de mais solavancos e gostaria de aumentar sua resposta. Enfim, ele me levou à seguinte técnica; ele usará o cStringIO, se disponível (MAS OBSERVAÇÃO: cStringIO e StringIO não são os mesmos , porque você não pode subclassificar o cStringIO ... é um built-in ... mas, para operações básicas, a sintaxe será idêntica, para que você possa fazer isso ):
fonte