fim de linha em um str

fim de linha em um str

por Pedro Felipe Higa Felizatto -
Número de respostas: 2

Oi pessoinhas

Se eu tenho o seguinte texto:

texto.txt:

" aaaaaaa \n aaaaaa

aaaaaaa \n

"

E eu vou transformá-lo em string, terei:

s=' aaaaaa \n aaaaa \n aaaaaa \n\n' (tanto faz a quantidade de 'a')

Como eu sei qual \n é quall? Qual foi escrito pelo usuário e qual foi escrito pelo computador na hora do 'enter'?

Eu pensei em ler o texto.txt linha por linha, mas isso me complica mais que me ajuda

 

Em resposta à Pedro Felipe Higa Felizatto

Re: fim de linha em um str

por José Coelho de Pina -

Oi Pedro,

Como eu sei qual \n é qual? Qual foi escrito pelo usuário e qual foi escrito pelo computador na hora do 'enter'?

A pergunta é a respeito de ambiguidade, certo?
A maneira de evitar ambiguidade está ligada a como representamos (no caso o Python representa) objetos diferentes, que são exibidos, as vezes, de maneira semelhante.
Antes de começar, para evitar ambiguidade...
Vou chamar tem newline o caractere que tem o efeito de mudar de linha.
newline é o caractere gravado quando teclamos ENTER.
Vou chamar de barra_n o string de comprimento 2 "\"+"n". barra_n é o string gravado quando teclamos "\" e depois teclamos "n".
Assim, newline é um caractere e barra_n é formado por 2 caracteres.

Se me permite, vou reformular a sua pergunta da maneira que eu a entendi:

Como o Python faz a distinção entre o caractere newline (teclei ENTER) e e o string barra_n?

A sua preocupação é legitima.

Vejamos o que o Python tem dizer a respeito.

% python
Python 3.6.1 (default, Sep  7 2017, 16:36:03) 
[GCC 6.3.0 20170406] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> newline = "\n"
>>> len(newline) # 1 caractere
1
>>> print("xx"+newline+"yy") # exibe xx, muda de linha, exibe yy
xx
yy
>>> barra = "\\"
>>> barra 
'\\'
>>> n = "n"
>>> barra_n = barra + n
>>> barra_n
'\\n'
>>> print(barra_n)
\n
>>> newline
'\n'
>>> barra_n
'\\n'
>>> print(newline)


>>> print(barra_n)
\n
>>> 

Conclusão 1. o caractere newline é representado por apenas um símbolo que o Python exibe, as vezes, como "\n" e que é exibido por print() pelo efeito de mudança de linha.

Conclusão 2. o string "barra_n" é representado internamente pelo string como "\\n" e exibido por print() como "\n".

Hmm, devo dizer que acho se você ignorar tudo isso e escrever o seu programa de uma maneira ingênua, é bem capaz que tudo de certo como você gostaria.
Os projetistas de linguagens de programação levam muitas coisas em consideração nas suas decisões de projeto.
Decisões de projeto é algo que vocês deverão exercitar nas próximas semanas.

Bem... tem mais uns testes a seguir. Hmm... talvez vocês devessem para de ler aqui e continuar o que estavam fazendo.

# crio um arquivo arq.bla com 2 newlines, 3 linhas e um substring "\"+"n"
% echo -e "xx\nyyy\\\nzzz\nwww" > arq.bla
# exibo o conteúdo do arquivo (nada nesta mão, nada nesta mão e ...)
% more arq.bla 
xx
yyy\nzzz
www
# note o substring "\" + "n" entre yyy e zzz, como seria digitado em um programa
% python # vamos ver o que o Python tem dizer a respeito
Python 3.6.1 (default, Sep  7 2017, 16:36:03) 
[GCC 6.3.0 20170406] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> fin = open("arq.bla","r") # abre arquivo para leitura
>>> s = fin.read() # s é string com o conteúdo do arquivo (= seq. de caracteres)
>>> fin.close() # feche o arquivo (não esquecer ou usar with)
>>> s  # note como o substring "\" + "n" é representado pelo Python em s
'xx\nyyy\\nzzz\nwww'
>>> len(s) 
15
>>> for i in range(len(s)): # vamos ver o conteúdo de s, caractere a caractere
...     print("s[%d] = '%c'"%(i,s[i]))
... 
s[0] = 'x'
s[1] = 'x'
s[2] = '
'
s[3] = 'y'
s[4] = 'y'
s[5] = 'y'
s[6] = '\'
s[7] = 'n'
s[8] = 'z'
s[9] = 'z'
s[10] = 'z'
s[11] = '
'
s[12] = 'w'
s[13] = 'w'
s[14] = 'w'
>>> # s[2] e s[11] contém o caractere newline 

Conclusão 3. Olhando apenas o valores exibidos de dois objetos é muitas vezes difícil saber se são iguais.
Olhem por exemplo o EP11.
Vendo apenas (1,2), exibido por print(), não sei dizer se o objeto é uma tupla de dois int ou é um Ponto2D.

 

Em resposta à José Coelho de Pina

Re: fim de linha em um str

por Pedro Felipe Higa Felizatto -

Olha... 

Depois de muito pensar, escrever um textão e logo depois apagá-lo aqui, vim comunicar o que ocorreu no programa

De alguma forma, fui reescrever o programa e tentei implementar o que entendi sobre newline e barra_n

No entanto descobri que meu EP já reconhecia as diferenças de newline e barra_n, enquanto eu não

Deletei tudo de novo que tinha escrito

Aí mandei rodar de novo

E deu certo (?)(?)(?)

To abismado

Mas to feliz

Acho que foi tudo uma travessura de Halloween que o Python fez comigo

Obrigado por me ajudar a entender o que acontecia!!

(Essa história seria uma fanfic muito ruim, logo seria boa, mesmo faltando umas frases tipo 'pisa menos Python', 'lacrei/tombei', 'calling all the manas')