Jump to content
Sign in to follow this  
Tafs

Procurar dentro de um Arquivo

Recommended Posts

Tafs

Olás!

Bom, primeiramente gostaria de dizer que sou iniciante em programação (mas até onde consegui me virar, adorei), e segundo, sou brasileiro, e por isso o português um pouco diferente. Me perdoem por isso, mas o fórum de vocês me chamou a atenção.  :thumbsup: Digamos apenas que lendo uns tópicos eu consegui ver que o nível dos usuários aqui é math.pi vezes superior ao de fóruns brasileiros, mas enfim...

Estou com uma dúvida quanto ao Python.  :down:

Não vou mentir para vocês, eu jogo Tibia, e nele há um arquivo de configuração de teclas de atalho (F1 ao F12) chamado Tibia.cfg (que fica na pasta AppData/Roaming/Tibia). Como tenho mais de um personagem e de vocações diferentes, é meio cansativo ter que mudar todos os atalhos quando mudar de personagem e para isso criei 4 pequenos scripts em Python.

Para importar as Hotkeys enquanto o Tibia.cfg estiver com as de Druid:

import shutil
shutil.copy('/Users/Renato/AppData/Roaming/Tibia/Tibia.cfg', '/Python31/Curso/Tibia/TibiaDruid.cfg')

Para enquanto o Tibia.cfg estiver com as de Paladin:

import shutil
shutil.copy('/Users/Renato/AppData/Roaming/Tibia/Tibia.cfg', '/Python31/Curso/Tibia/TibiaPaladin.cfg')

E finalmente outros dois scripts para copiar o TibiaPaladin.cfg e o TibiaDruid.cfg para a pasta do jogo e renomear o arquivo como Tibia.cfg para que funcione:

import shutil
shutil.copy('/Python31/Curso/Tibia/TibiaDruid.cfg', '/Users/Renato/AppData/Roaming/Tibia/Tibia.cfg')

import shutil
shutil.copy('/Python31/Curso/Tibia/TibiaPaladin.cfg','/Users/Renato/AppData/Roaming/Tibia/Tibia.cfg')

O ponto é que eu gostaria de montar um script que conseguisse ler uma determinada palavra do arquivo Tibia.cfg e a partir dela determinar qual seria mais adequado: o TibiaPaladin.cfg ou TibiaDruid.cfg.

Exemplo: Caso encontrasse a palavra "frigo" no Tibia.cfg, o script substituiria o conteúdo pelo mesmo do TibiaPaladin, e caso encontrasse a palavra "san", o script substituiria o conteúdo pelo TibiaDruid.cfg.

No geral, a dúvida é realmente nesta parte de ler e interpretar, que não consigo de jeito nenhum.  :D

Share this post


Link to post
Share on other sites
Pedro C.

Olá,

Se entendi a tua dúvida tem a ver com a leitura e escrita de ficheiros. Para isso é importante saber o formato do ficheiro que vais ler. De qualquer maneira para leres um ficheiro fazes:

ficheiro=open('caminho do ficheiro','r')

O 'r' significa 'read'. Se estivesse a abrir este ficheiro para escrever teria que meter lá 'w' ('write' portanto). Para leres linhas no teu ficheiro fazes:

ficheiro.readline()

Agora eu não sei em que linha terá de estar essa palavra no ficheiro tibia.cfg mas vou exemplificar como se estivesse na terceira linha:

ficheiro = open('..../Tibia/Tibia.cfg','r') # Abro o ficheiro para leitura

ficheiro.readline() # Passo a primeira linha à frente porque não preciso dela.
ficheiro.readline() # Passo a segunda linha à frente porque não preciso dela.

palavra = ficheiro.readline() # Atribuo a terceira linha (a tal que preciso) à variável palavra.

if palavra == 'frigo':     # Se a variável palavra for a string 'frigo' então...
       ficheiro.close()      # Fecho a variável ficheiro (que tem o tibia.cfg aberto).
       shutil.copy('.../Curso/Tibia/TibiaPaladin.cfg','.../Tibia/Tibia.cfg'   # e copio o que pretendo para o sitio que pretendo.
elif palavra =='san':     # Se a palavra for 'san' então faz o mesmo processo mas copiando outro ficheiro.
       ficheiro.close()      
       shutil.copy('.../Curso/Tibia/TibiaDruid.cfg','.../Tibia/Tibia.cfg' )  

Não experimentei este código mas em teoria deverá funcionar. Espero que ajude.

Share this post


Link to post
Share on other sites
Tafs

Opa, me ajudou sim, obrigado. Ainda hei de testar ele aqui, mas eu entendi sim o que você colocou aí, e é exatamente isso que eu queria.  :D

Só mais uma coisinha: Não há como fazer o script procurar pela palavra frigo ou san no arquivo de texto (o Tibia.cfg é um arquivo de texto que dá para ser aberto com o Notepad do Windows) sem ter que especificar a linha em que a palavra está? Não que seja um problema, pois creio que essa palavra sempre estará na linha devida, mas seria bom previnir, caso a hotkey seja mudada no futuro.  :D

De qualquer forma, muitíssimo obrigado pela resposta!  :thumbsup:

Share this post


Link to post
Share on other sites
Tafs

Bom amigo, acabei de testar o código que me passaste, mas não consegui fazê-lo funcionar.  :thumbsup:

Quando fui tentar rodá-lo percebi que não havia mudado nada nos arquivos, e tentei rodá-lo com o editor do IDLE, e ele retorna que há um erro de sintaxe no 'elif' (o que sinceramente não entendi o porque).

Ainda assim aprecio tua colaboração comigo  ;)

Edit:

Após dar uma olhada no programa vi que faltava fechar o parêntesis no final da linha anterior, hehe. Agora o PC consegue executar o script, mas ainda assim ele não funciona, mas já é alguma coisa...

Share this post


Link to post
Share on other sites
Pedro C.
Após dar uma olhada no programa vi que faltava fechar o parêntesis no final da linha anterior, hehe. Agora o PC consegue executar o script, mas ainda assim ele não funciona, mas já é alguma coisa...

Tens que ser mais especifico. Ele executa o script, tudo bem, mas o que é que ele faz ou não faz que tu queiras que ele faça?

De qualquer maneira para despiste do teu problema vê se estás a passar linhas suficientes até chegares aquela que pretendes mesmo ver se é "frigo" ou "san". Se ele executa o script mas não faz nada então é porque não entra em nenhum dos casos possíveis. Para veres o que se está a passar experimenta meter este código no teu programa:

ficheiro = open('..../Tibia/Tibia.cfg','r') # Abro o ficheiro para leitura

ficheiro.readline() # Passo a primeira linha à frente porque não preciso dela.
ficheiro.readline() # Passo a segunda linha à frente porque não preciso dela.

palavra = ficheiro.readline() # Atribuo a terceira linha (a tal que preciso) à variável palavra.

print palavra #Isto vai dizer-te o que ele está a ler exactamente nesta variável.

if palavra == 'frigo': 
       print 'entrou no caso do frigo'    # se isto aparecer então entrou para o primeiro caso
       ficheiro.close()      
       shutil.copy('.../Curso/Tibia/TibiaPaladin.cfg','.../Tibia/Tibia.cfg' )  
elif palavra =='san':     
       print 'entrou no caso do san'  # isto é o segundo caso.
       ficheiro.close()      
       shutil.copy('.../Curso/Tibia/TibiaDruid.cfg','.../Tibia/Tibia.cfg' )  
else:
       print 'Nenhum dos casos se verificou' # isto vai aparecer se a variável palvra não for nem frigo nem san.

O comando print serve para visualizar o que tu quiseres na consola. Repara que meti um print no antes de entrar no "if" e depois outros para cada caso (frigo,san, e nenhum deles). Se o último caso aparecer mas tu tens a certeza que estás na linha certa então o problema deverá ser com a leitura do caracter de passagem de linha ('\n'). Se assim for é uma questão de meteres o que aparecer lá no print da variável palavra, estilo 'frigo\n':

if palavra == 'frigo\n': 
       print 'entrou no caso do frigo'    # se isto aparecer então entrou para o primeiro caso
       ficheiro.close()      
       shutil.copy('.../Curso/Tibia/TibiaPaladin.cfg','.../Tibia/Tibia.cfg' )  
elif palavra =='san\n':     
       print 'entrou no caso do san'  # isto é o segundo caso.
       ficheiro.close()      
       shutil.copy('.../Curso/Tibia/TibiaDruid.cfg','.../Tibia/Tibia.cfg' )  
else:
       print 'Nenhum dos casos se verificou' # isto vai aparecer se a variável palvra não for nem frigo nem san.

Só mais uma coisinha: Não há como fazer o script procurar pela palavra frigo ou san no arquivo de texto (o Tibia.cfg é um arquivo de texto que dá para ser aberto com o Notepad do Windows) sem ter que especificar a linha em que a palavra está? Não que seja um problema, pois creio que essa palavra sempre estará na linha devida, mas seria bom previnir, caso a hotkey seja mudada no futuro.

Sim, isto é possível de fazer. Existem várias maneiras mas talvez a mais simples é fazendo perguntas a uma lista. Repara no código seguinte feito na consola do python:

>>> a=['a','b','c']   # isto é uma lista
>>> a.append('d')   # com isto estou a acrescentar um novo elemento à lista
>>> a
['a', 'b', 'c', 'd']
>>> 'a' in a    # agora estou a perguntar se o elemento 'a' existe na lista "a"
True
>>> 'e' in a    # e se 'e' existe na lista "a"
False
>>> 

O que eu fiz foi construir uma lista inicial de variável "a" que contem 3 elementos ('a','b' e 'c'). Entretanto acrescentei outro elemento à lista ('d') e agora "a" passou a ser ['a','b','c','d']. A seguir perguntei se o elemento 'a' existe na variável "a" (True -> verdade) e depois se o elemento 'e' existe em "a" (False -> falso). Agora a ideia é, em vez de estares a condicionar os teus ficheiro.readline() com números constantes, inserires um ficheiro.readlines() (repara no plural readlines), o que te vai dar uma lista de todas as strings (linha a linha se não estou enganado). A seguir é só fazeres o que está explicado acima, pelo que o código ficaria:

ficheiro = open('..../Tibia/Tibia.cfg','r') # Abro o ficheiro para leitura

lista=ficheiro.readlines() 

if 'frigo\n' in lista:
       print 'entrou no caso do frigo'    # se isto aparecer então entrou para o primeiro caso
       ficheiro.close()      
       shutil.copy('.../Curso/Tibia/TibiaPaladin.cfg','.../Tibia/Tibia.cfg' )  
elif 'san\n' in lista:    
       print 'entrou no caso do san'  # isto é o segundo caso.
       ficheiro.close()      
       shutil.copy('.../Curso/Tibia/TibiaDruid.cfg','.../Tibia/Tibia.cfg' )  
else:
       print 'Nenhum dos casos se verificou' # isto vai aparecer se a variável palvra não for nem frigo nem san.

Agora com isto estou a assumir que 'frigo' e 'san' não podem aparecer os dois no mesmo ficheiro (no outro caso até podiam aparecer porque o que tu estavas a analisar é uma linha e não um ficheiro inteiro). Boa sorte com o teu programa.

Share this post


Link to post
Share on other sites
djthyrax

h = open("ficheiro onde queres ler", "r")
tmp = h.read().lower()
h.close()

if "texto do druida" in tmp:
    open("ficheiro onde queres escrever", "w").write(open("ficheiro do druida", "r").read())
elif "texto do xpto" in tmp:
    open("ficheiro onde queres escrever", "w").write(open("ficheiro do xpto", "r").read())
#.......
else:
    open("ficheiro onde queres escrever", "w").write(open("ficheiro a ler caso nao encontre nada dos anteriores", "r").read())

Should do the trick, assim duma forma "um bocado" à pedreiro.

Ler com o readlines() é algo desnecessário neste caso e pode provocar problemas caso ele tenha " san\n" e não "san\n". O mais correcto, de forma a evitar alguns, é usar o read() e de seguida pôr todo o texto em lowercase, de forma a que até "\t\t\t\t\t  \t  SaNtInHaS\n" passe no caso. Para evitar que outras palavras começadas por san ou que contenham san passem, basta processar à palavra usando .read().lower().split().


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Share this post


Link to post
Share on other sites
Tafs

Não fazem ideia do quanto me ajudaram! Sério!  ;)

Obrigado a todos. Vou logo testar essas dicas e caso obtenha sucesso eu relato aqui para vocês.  :thumbsup:

Edit:

Seu code funcionou, djthyrax! MUITÍSSIMO OBRIGADO!  :thumbsup:

Ainda assim, eu gostaria de solucionar uma outra dúvida a respeito do code que o Pedro C. postou:

ficheiro = open('/Python31/Curso/Tibia/Tibia.cfg','r') # Abro o ficheiro para leitura

lista = ficheiro.readlines()

if 'frigo\n' in lista:
       print ('entrou no caso do frigo')    # se isto aparecer então entrou para o primeiro caso
       ficheiro.close()      
       shutil.copy('/Python31/Curso/Curso/Tibia/TibiaPaladin.cfg','/Python31/Curso/Tibia/Tibia.cfg' )  
elif 'san\n' in lista:    
       print ('entrou no caso do san')  # isto é o segundo caso.
       ficheiro.close()      
       shutil.copy('/Python31/Curso/Curso/Tibia/TibiaDruid.cfg','/Python31/Curso/Tibia/Tibia.cfg' )  
else:
       print ('Nenhum dos casos se verificou') # isto vai aparecer se a variável palvra não for nem frigo nem san.

Nesse caso verifiquei que o script "funcionou". Não houve erros de sintaxe ou algo parecido, e no final até mostrou a msg de que Nenhum dos casos se verificou, mas é este o problema. O arquivo contém a palavra san mas o script não substitui o conteúdo do arquivo pelo TibiaDruid.cfg (que seria o desejado).

Seguem abaixo os arquivos que estou usando como teste (os originais eu mantenho em outro diretório, hehe):

Tibia.cfg:

# Tibia - graphical Multi-User-Dungeon
# DO NOT EDIT THIS FILE

Version = 870
Engine = 1
FullscreenMode = (640,480,32)
BasicBrightness = 65
WindowsMousepointer = yes
LightEffects = yes
TextualEffects = yes
CreatureInfo = 2
NoStretching = no
ConfineFramerate = 50
Hotkey = (0,"#s exura\n",0,0,0)
Hotkey = (1,"#s exori san\n",0,0,0)
Hotkey = (2,"#s exori con\n",0,0,0)
Hotkey = (3,"#s exura gran\n",0,0,0)
Hotkey = (4,"",237,0,2)
Hotkey = (5,"",236,0,2)
Hotkey = (6,"",7642,0,2)
Hotkey = (7,"",3161,0,1)
Hotkey = (8,"utani hur\n",0,0,0)
Hotkey = (11,"",3031,0,0)
Hotkey = (35,"",3450,0,0)
WindowedMode = (198,122,720,669,yes)
ConsoleHeight = 319
AutomapZoom = 2
ContentWindow = (9,148)
ContentWindow = (6,289)
ContentWindow = (7,41)
BuddySortmethods = (2,1,0)
BuddyHideOffline = no
OpenDialogs = 3
OpenDialogs = 1
OpenDialogs = 4
OpenDialogs = 5
LastMotD = 945
CooldownBar = yes
InfoMessages = yes
EventMessages = yes
StatusMessages = yes
TimeStamps = yes
Levels = yes
PrivateMessages = yes
ClassicControl = yes
AutoChaseOff = yes
AttackMode = 3
ChaseMode = 0
SecureMode = 1
Buddy = (6533645,0,"",yes)
Buddy = (36629013,2,"filho de lizard.",yes)
White = {}
Ignore = {}
KnownTutorialHints = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,18,19}
ExperienceBar = yes
LevelBar = yes
StaminaBar = yes
MagLevelBar = yes
SkillBars = {,4}
SortOrderBuy = 0
SortOrderSell = 2
BuyWithBackpacks = no
IgnoreCapacity = no
SellEquipped = no

TibiaPaladin.cfg:

# Tibia - graphical Multi-User-Dungeon
# DO NOT EDIT THIS FILE

Version = 870
Engine = 1
FullscreenMode = (640,480,32)
BasicBrightness = 65
WindowsMousepointer = yes
LightEffects = yes
TextualEffects = yes
CreatureInfo = 2
NoStretching = no
ConfineFramerate = 50
Hotkey = (0,"#s exura\n",0,0,0)
Hotkey = (1,"#s exori san\n",0,0,0)
Hotkey = (2,"#s exori con\n",0,0,0)
Hotkey = (3,"#s exura gran\n",0,0,0)
Hotkey = (4,"",237,0,2)
Hotkey = (5,"",236,0,2)
Hotkey = (6,"",7642,0,2)
Hotkey = (7,"",3161,0,1)
Hotkey = (8,"utani hur\n",0,0,0)
Hotkey = (11,"",3031,0,0)
Hotkey = (35,"",3450,0,0)
WindowedMode = (198,122,720,669,yes)
ConsoleHeight = 319
AutomapZoom = 2
ContentWindow = (9,148)
ContentWindow = (6,289)
ContentWindow = (7,41)
BuddySortmethods = (2,1,0)
BuddyHideOffline = no
OpenDialogs = 3
OpenDialogs = 1
OpenDialogs = 4
OpenDialogs = 5
LastMotD = 945
CooldownBar = yes
InfoMessages = yes
EventMessages = yes
StatusMessages = yes
TimeStamps = yes
Levels = yes
PrivateMessages = yes
ClassicControl = yes
AutoChaseOff = yes
AttackMode = 3
ChaseMode = 0
SecureMode = 1
Buddy = (6533645,0,"",yes)
Buddy = (36629013,2,"filho de lizard.",yes)
White = {}
Ignore = {}
KnownTutorialHints = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,18,19}
ExperienceBar = yes
LevelBar = yes
StaminaBar = yes
MagLevelBar = yes
SkillBars = {,4}
SortOrderBuy = 0
SortOrderSell = 2
BuyWithBackpacks = no
IgnoreCapacity = no
SellEquipped = no

TibiaDruid.cfg:

# Tibia - graphical Multi-User-Dungeon
# DO NOT EDIT THIS FILE

Version = 870
Engine = 1
FullscreenMode = (640,480,32)
BasicBrightness = 65
WindowsMousepointer = yes
LightEffects = yes
TextualEffects = yes
CreatureInfo = 2
NoStretching = no
ConfineFramerate = 50
Hotkey = (0,"#w exura\n",0,0,0)
Hotkey = (1,"#w exori frigo\n",0,0,0)
Hotkey = (2,"#w exura gran\n",0,0,0)
Hotkey = (3,"#w exori gran frigo\n",0,0,0)
Hotkey = (4,"",237,0,2)
Hotkey = (5,"#w exura sio \"Kash Eowin\n",0,0,0)
Hotkey = (6,"#w exura gran mas res\n",0,0,0)
Hotkey = (7,"",3161,0,1)
Hotkey = (8,"#w exori tera\n",0,0,0)
Hotkey = (9,"#w exevo frigo hur\n",0,0,0)
Hotkey = (10,"#w exevo gran frigo hur\n",0,0,0)
Hotkey = (11,"",3031,0,0)
Hotkey = (24,"#w exani hur up\n",0,0,0)
Hotkey = (25,"#w exani hur down\n",0,0,0)
Hotkey = (35,"",3450,0,0)
WindowedMode = (386,11,720,669,yes)
ConsoleHeight = 234
AutomapZoom = 1
ContentWindow = (9,38)
ContentWindow = (6,38)
ContentWindow = (7,95)
BuddySortmethods = (2,1,0)
BuddyHideOffline = no
OpenDialogs = 3
OpenDialogs = 1
OpenDialogs = 5
OpenDialogs = 4
LastMotD = 947
CooldownBar = yes
InfoMessages = yes
EventMessages = yes
StatusMessages = yes
TimeStamps = yes
Levels = yes
PrivateMessages = yes
OpenChannel = 0
OpenChannel = 65534
ClassicControl = yes
AutoChaseOff = yes
AttackMode = 3
ChaseMode = 0
SecureMode = 1
Buddy = (6533645,0,"",yes)
Buddy = (36629013,2,"filho de lizard.",yes)
White = {}
Ignore = {}
KnownTutorialHints = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,18,19}
ExperienceBar = yes
LevelBar = yes
StaminaBar = yes
MagLevelBar = yes
SkillBars = {,4}
SortOrderBuy = 0
SortOrderSell = 2
BuyWithBackpacks = no
IgnoreCapacity = no
SellEquipped = no

Alguma ideia?

Share this post


Link to post
Share on other sites
Pedro C.

Sim. Nos teus ficheiros, e corrigi-me se estou enganado, tu queres ler o "frigo" ou o "san" nas linhas que têm isto:

Hotkey = (1,"#s exori san\n",0,0,0)

Hotkey = (1,"#w exori frigo\n",0,0,0)

Quando está a fazer a leitura do ficheiro à linha o que tu estás a ler é a linha inteira e por isso a string que vais retirar de um ficheiro.readline() é a string "Hotkey = (1,"#w exori frigo\n",0,0,0)" que não é igual a "frigo\n". Precisas de trabalhar sobre as strings que estás a receber.

Se a linha em que fores ler o "frigo" ou "san" tiver sempre a string "Hotkey = (1,"#w exori frigo\n",0,0,0)" ou "Hotkey = (1,"#s exori san\n",0,0,0)" podes substituir isso no teu código:

ficheiro = open('/Python31/Curso/Tibia/Tibia.cfg','r') # Abro o ficheiro para leitura

lista = ficheiro.readlines()

if 'Hotkey = (1,"#w exori frigo\n",0,0,0)\n' in lista:
       print ('entrou no caso do frigo')    # se isto aparecer então entrou para o primeiro caso
       ficheiro.close()      
       shutil.copy('/Python31/Curso/Curso/Tibia/TibiaPaladin.cfg','/Python31/Curso/Tibia/Tibia.cfg' )  
elif 'Hotkey = (1,"#s exori san\n",0,0,0)\n' in lista:    
       print ('entrou no caso do san')  # isto é o segundo caso.
       ficheiro.close()      
       shutil.copy('/Python31/Curso/Curso/Tibia/TibiaDruid.cfg','/Python31/Curso/Tibia/Tibia.cfg' )  
else:
       print ('Nenhum dos casos se verificou') # isto vai aparecer se a variável palvra não for nem frigo nem san.

Pelos ficheiros que meteste aqui pergunto-me se sabes o que o '\n' significa? Se não souberes o porquê dele estar lá avisa porque isso é importante para tudo o resto. É que nos ficheiros que meteste aqui aparece-te os '\n' a meio das linhas o que é, no mínimo, incomum.

Share this post


Link to post
Share on other sites
Tafs

Sim. Nos teus ficheiros, e corrigi-me se estou enganado, tu queres ler o "frigo" ou o "san" nas linhas que têm isto:

Quando está a fazer a leitura do ficheiro à linha o que tu estás a ler é a linha inteira e por isso a string que vais retirar de um ficheiro.readline() é a string "Hotkey = (1,"#w exori frigo\n",0,0,0)" que não é igual a "frigo\n". Precisas de trabalhar sobre as strings que estás a receber.

Se a linha em que fores ler o "frigo" ou "san" tiver sempre a string "Hotkey = (1,"#w exori frigo\n",0,0,0)" ou "Hotkey = (1,"#s exori san\n",0,0,0)" podes substituir isso no teu código:

ficheiro = open('/Python31/Curso/Tibia/Tibia.cfg','r') # Abro o ficheiro para leitura

lista = ficheiro.readlines()

if 'Hotkey = (1,"#w exori frigo\n",0,0,0)\n' in lista:
       print ('entrou no caso do frigo')    # se isto aparecer então entrou para o primeiro caso
       ficheiro.close()      
       shutil.copy('/Python31/Curso/Curso/Tibia/TibiaPaladin.cfg','/Python31/Curso/Tibia/Tibia.cfg' )  
elif 'Hotkey = (1,"#s exori san\n",0,0,0)\n' in lista:    
       print ('entrou no caso do san')  # isto é o segundo caso.
       ficheiro.close()      
       shutil.copy('/Python31/Curso/Curso/Tibia/TibiaDruid.cfg','/Python31/Curso/Tibia/Tibia.cfg' )  
else:
       print ('Nenhum dos casos se verificou') # isto vai aparecer se a variável palvra não for nem frigo nem san.

Pelos ficheiros que meteste aqui pergunto-me se sabes o que o '\n' significa? Se não souberes o porquê dele estar lá avisa porque isso é importante para tudo o resto. É que nos ficheiros que meteste aqui aparece-te os '\n' a meio das linhas o que é, no mínimo, incomum.

Bom, obrigado pela resposta.

Quanto ao \n encontrado nos arquivos .cfg eu não faço ideia do porque são assim. Quando as hotkeys são configuradas no jogo eu só coloco a "palavra mágica" e pronto. O \n é adicionado pelo próprio client e aparentemente só quando a hotkey contém um texto (há outras hotkeys configuradas aí, só que elas são para usar determinado item, e não mandar um texto no jogo).  🤔

Share this post


Link to post
Share on other sites
icemonster2

Opa, me ajudou sim, obrigado. Ainda hei de testar ele aqui, mas eu entendi sim o que você colocou aí, e é exatamente isso que eu queria.  :thumbsup:

Só mais uma coisinha: Não há como fazer o script procurar pela palavra frigo ou san no arquivo de texto (o Tibia.cfg é um arquivo de texto que dá para ser aberto com o Notepad do Windows) sem ter que especificar a linha em que a palavra está? Não que seja um problema, pois creio que essa palavra sempre estará na linha devida, mas seria bom previnir, caso a hotkey seja mudada no futuro.  ;)

De qualquer forma, muitíssimo obrigado pela resposta!  :D

Para te ajudar desenvolvi um programa de login, que procura o nome de utilizador num ficheiro e a pass do utilizador noutro. sem saber em que linha é que está.

]
# Sistema de login desenvolvido por Nuno Sabino.(Ice_Monster)
ficheiro = open("utilizadores.txt", "r")
def login(username, senha):
    '''Funcao para um utilizador fazer login .'''
    login = ficheiro.readlines()
    username = raw_input("Introduza seu utilizador: ")
    utilizador = username + "\n"
    try:
        if utilizador in login:
            senhas = open("senhas.txt", "r")
            passwords = senhas.readlines()
            senha = raw_input("Introduza a sua senha: ")
            password = username + "=" + senha + "\n"
            if password in passwords:
                print "Login feito."
            else:
                print "Senha incorrecta."
        else:
            print "login nao encontrado. A Sair."
    except:
        print "Login nao encontrado. A sair."
username = "?"
senha = "?"
login(username, senha)
ficheiro.close()

Em vez de dois ficheiros podia ser só um, é muito fácil, apenas não tenho tempo para modificar, fica para outro dia.

Share this post


Link to post
Share on other sites
SirDave

Procurar uma palavra num texto?

Fiz agora isto, funciona bem:

def find_word_in_file(filename, word):
    f = open(filename,"r")
    file_array = f.readlines()
    print file_array
    f.close()
    for i in file_array:
        if i.find(word)>=0:
            return True
    return False

Aqui tens um exemplo de como usar

my_bool = find_word_in_file("text.txt", "world")   #Devolve True se "world" estiver no ficheiro text.txt, e False se não estiver


Be nice to see your eyes, blink them from time to time to relax your retina when using the computer. Blink now!

Share this post


Link to post
Share on other sites
Smoon

Concordo em tudo com o djthyrax e reforço.

Um dos problemas do 1º código que te foi apresentado é caracter "\n" que significa fim de linha.

Por exemplo, se o teu ficheiro for:

blablabla
blablabla
san
blablabla

Chamando um readline() na terceira linha, ele devolve-te "san\n", em vez de "san". Aquele "\n", que indica o fim da linha, é um caracter invisível, e então o 1º código não funciona, em parte devido a isso.

Um outro facto é que podes querer ver se a linha (ou o texto todo) contém "san" em vez de ver se a linha é exactamente igual a "san" ou "san\n".

A função read() lê o texto todo do ficheiro de uma só vez, e depois com o teste:

if "texto do druida" in tmp:

vês se contem a palavra ou expressão que tu queres.

Se quiseres testar se encontras uma palavra isolada e curta como "san", pode ser conveniente utilizadres um split(), pois essa função separa todas as palavras do texto de acordo com " " (espaços), "\t" (tabs) ou "\n" (fim de linha), e evita que confundas "san" com "sandes" ou "santinhas", por exemplo. [split() devolve-te uma lista com a qual também podes utilizar o teste com "in"].

Como a palavra "san" é pequena considero que é importante utilizares o split(), por exemplo:

h.read.lower().split()            //onde h é a variável que representa o teu ficheiro a ler

[/code]

Se quizeres converter todas as maiúsculas para minúsculas e tratá-las de igual modo usas a função lower(), opcionalmente [por ex. "SAN".lower() devolve "san"].

Espero ter ajudado a clarificar mais as coisas.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.