Pegar trechos especificos em arquivos txt no python

To programando um RPG de texto no pycharm, pra não sujar meu código pensei em criar arquivos txt e depois importar os trechos que preciso, porém minha dúvida é:

Como posso pegar os trechos específicos que preciso e trazer pro meu programa ?

Pensei algo tipo: prologo = “Você acorda numa estrada escura e é surpreendido por ruídos de galhos se quebrando…”

Não consegui compreender direito essa parte de manipulação de textos no python.

1 curtida

@JG22, veja se vc consegue ajudar o rapaz aí…

Isso pode te ajudar:

2 curtidas

Acho que a melhor maneira de lidar com esse cenário é tornar esses trechos um arquivo de código com dicts que podem então ser importadas, reutilizando mecanismos de própria linguagem.

Outra opção é utilizar algum formato estruturado que já existente, como JSON (vem inclusive suporte direto no Python, por meio do import json).

Ambas soluções são mais diretas e robustas do que, no fim das contas, fazer uma reimplementação do grep no Python. Bom, se você quiser, pode fazer abrindo o arquivo e fazendo for linha-por-linha e dando break quando achar um valor relevante (por exemplo, com startswith().

1 curtida

Não entendo json, pode me recomendar alguma fonte pra consulta ?

Eu entendi o exemplo, mas tipo, pra salvar os parágrafos eu teria que quebrar palavra por palavra pra salvar no dic? ou daria pra salvar o paragrafo todo numa posição só ?

Acredito que esse artigo possa ser uma boa introdução. Se você entendeu os dicionários de Python, vai ver que JSON é só uma maneira diferente de expressar a mesma coisa.

Poderia, o exemplo só quebrou palavra por palavra porque ele tinha mais de uma informação em cada parágrafo.

Aqui, a informação que você quer armazenar é o parágrafo em si, então a função retornaria ele todo.

(porém, como eu já sugeri, você controla o formato e o conteúdo desse .txt hipotético, então acredito que transformá-lo num arquivo de código já com o dict pronto e importá-lo seria mais natural).

1 curtida

Vou testar todas as opções, obrigado a todos pelas dicas.

Apenas complementando o que o @Capezotte disse, pense bem em como vai organizar os diálogos para não ter retrabalho, você pode até aproveitar para internacionalizar os diálogos:

{
  "prologo": {
    "linha_temporal_A": {
      "PT_BR": "blablablabla",
      "US": "blablablabla"
    }, ...
  }, "diag2": { 
    ...
}, ...
}

e assim vai poder acessar com:

...
with open("file_path") as file:
    dialogs = json.load(file)

LTs = ['linha_temporal_A", ...]
...
# if locale US...
print(dialog["prologo"][LTs[0]]["US"])
2 curtidas

Muito bacana esse exemplo, esse é com o json né ? Eu fiz um teste usando um arquivo .py com dicionários, funcionou bacaninha, eu consigo chamar os trechos que preciso através da key e até precisei de menos código, usando dics dá pra criar outros dics internos, eu não sabia disso até testar. Mas obrigado pela dica.

Esse exemplo é JSON.

Não confunda dicionários com JSON. JSON é um formato de dados em forma de texto e dicionário é uma estrutura de dados do Python, um objeto em memória.

Você pode fazer algo como:

dict = { "queue": multiprocessing.Queue() }

com dicionários, mas você vai ter problemas convertendo esse dicionário para JSON ou um arquivo, é necessário que os objetos no seu dicionário sejam “pickable/serializáveis”(possam ser representados em forma de binário/texto) e geralmente objetos que contem estados como filas de processos não são fáceis de serializar, isso quando é viável.

Geralmente conseguimos fazer o “pickle” desses objetos, mas ai é um formato binário e envolve outras questões como segurança, etc. Deixei mais como uma curiosidade, provavelmente você não vai precisar usar algo assim tão cedo mas é bom ter uma noção dessas diferenças.

1 curtida

Entendi, esse é meu primeiro jogo que to desenvolvendo, então ainda não sei ao certo o que seria melhor, em questões de desempenho e segurança, entre colocar os textos em dics no .py ou em arquivos de .txt, ai como nos testes o dic funcionou bem, acabei optando por ele. Preciso me aprofundar mais em json pelo que parece.

o problema de segurança não reside no uso de dicionários em sí mas sim em como o programa vai converter o texto cru em um objeto na memória.

JSON é seguro pois seu formato é bem limitado, você pode apenas ter objetos com atributos texto, números, booleanos, nulo, outro objeto com estas mesmas restrições ou lista de um dos tipos anteriores.

Pickle pode ir muito além, por exemplo:

    # alguém mal intencionado
    lambda_do_mal = lambda x: ... # função que deleta tudo na pasta home
    dill.dump(llambda_do_mal open('lambda_boasinha.pickle', 'wb'))
    ...
    # você no seu computador
    lambda_boasinha = dill.load(open('lambda_boasinha.pickle', 'rb'))
    lambda_boasinha(...) # a suposta lambda ~boasinha~ deleta tudo na pasta home

Quando você lê um JSON ele vira um dicionário na memória do processo de qualquer forma. A questão é que ler com a biblioteca JSON é seguro.

Achei bom já te dar essas informações pois uma hora você pode querer implementar save em arquivo e pode surgir a tentação de usar pickle para guardar coisas mais complexas como objetos em jogo, não faça isso.

2 curtidas

Verdade kkkk, me surgiu essa ideia de usar um dic pra criar um sistema de save rustico, eu ainda preciso pesquisar como implementar sistemas de save em um jogo de forma segura e que principalmente não permita o jogador fazer alterações pra ganhar vantagens. Sem querer abusar muito, eu posso pedir algumas recomendações de estudo ?

a solução ai continua sendo JSON ao meu ver, pickle é para coisas mais exóticas como compartilhamento de memória entre processos, etc. Você pode recorrer a assinatura digital ou coisas parecidas para proteger contra tampering, dentre outras coisas para dificultar trapassas, mas sem ser algo atrás de um servidor você dificilmente vai impedir completamente a pessoa de futricar no save file e no programa para obter vantagem.

1 curtida

Não vai ter servidor, mas tipo, existe alguma forma de quebrar os pacotes tipo um quebra cabeça pra dificultar a pessoa de reconhecer o que é o save e o que é arquivo sem valor ? tipo uma criptografia.

Tem várias técnicas para fazer isso, como combinar valores para criar somas de verificação, comprimir, criptografar (mesmo técnicas simples como XORing e/ou rotações do alfabeto já vão longe em deter um “amador”), etc.

Porém, como já foi notado, a única maneira de fazer isso com segurança absoluta é processando e armazenando o arquivo de salvamento em um servidor. Caso contrário, quem está em casa vai ter acesso total ao código que gera o arquivo, e basta dedicação para criar um editor de saves (vide as séries GTA e Pokémon, que têm travas bastante complicadas nos saves, e mesmo assim há trapaças).

1 curtida

Tem, mas eu acho que é um exagero… você ainda vai ter que lidar com o fato de que o Python não obfusca o seu código. (PS: não é impossível obfuscar o código Python, mas não é simples)