Jump to content
Psycho_Mind

[Resolvido] Load ficheiros de diretorio

Recommended Posts

Psycho_Mind

Boas.

Quero que um utilizador carregue um determinado ficheiro .txt, sendo que deverá ser dado ao mesmo a possibilidade de o carregar de qualquer diretorio, ou seja, deve aparecer um navegador que permita ao mesmo ir ao diretorio e escolher o ficheiro que quer.

O melhor que consigo é navegar por diretorios (exemplo abaixo) e escolher o diretorio que quero, fica-me é a faltar a possibilidade de escolher o ficheiro.

root = Tkinter.Tk()
root.withdraw()
dirname = tkFileDialog.askdirectory(parent=root,initialdir="/",title='Please select a directory')

Share this post


Link to post
Share on other sites
Pedro C.

Eu não sei fazer isso no Tkinter mas o FileDialog é aquilo que estás à procura (e a usar). Acho que simplesmente tens de lhe indicar que o que pretendes é um ficheiro e não uma directoria talvez usando "askopenfile" ou o "askopenfilename" (ver: http://tkinter.unpythonic.net/wiki/tkFileDialog) em vez do "askdirectory" que estás a usar.

Share this post


Link to post
Share on other sites
Psycho_Mind

Eu não sei fazer isso no Tkinter mas o FileDialog é aquilo que estás à procura (e a usar). Acho que simplesmente tens de lhe indicar que o que pretendes é um ficheiro e não uma directoria talvez usando "askopenfile" ou o "askopenfilename" (ver: http://tkinter.unpythonic.net/wiki/tkFileDialog) em vez do "askdirectory" que estás a usar.

É isso mesmo...

Entretanto consegui resolver a coisa assim:

Tk().withdraw()
file = askopenfilename()
print(file)

Depois estou a utilizar esta forma para ler o ficheiro e posteriormente obter o seu conteudo:

ler = open(file, 'r')
resultado = pickle.load(ler)

Como é que consigo ter mesmo o ficheiro (.txt por exemplo) por inteiro... Ou seja, agora preciso de fazer algo sobre o ficheiro em si, não sobre o seu conteudo. Qual poderá ser a melhor forma?

Com o Tkinter obtenho o caminho do ficheiro, se fizer um cut so para ficar com o ficheiro consigo o que pretendo, ou fico so mesmo desta forma com o nome do ficheiro ?

Edited by Psycho_Mind

Share this post


Link to post
Share on other sites
Pedro C.

Isso depende de vários factores e também do tamanho dos ficheiros. O seguinte código passa todo o ficheiro para dentro de uma lista em python:

fid = open(caminho,'r') # Abertura do ficheiro. Seria 'w' de write se fosse para escrever. 'r' é de read.
lista = fid.readlines()	# Passagem de todo o conteudo do ficheiro para uma lista python (eu atribui à variável de nome tambem 'lista').
fid.close()					# Fechar o ficheiro, caso contrário - mesmo que tenha lido tudo - o ficheiro continua aberto e pode dar problemas depois.

O problema da lista é que ocupa muita memória. Imagina que tens um ficheiro ASCII de 50 mb ou mais. Passares isso para uma lista vai ocupar-te muita memória. Se os teus dados forem numéricos em colunas (sem espaços em branco) podes utilizar o seguinte código (usando o numpy, a biblioteca numérica do python).

import numpy as np							 # importa o numpy como np
fid = open(caminho,'r')
matriz = np.loadtxt(fid,dtype='float32') # matriz é agora um array com as dimensões (linhas, colunas).
fid.close()

Outro caso é se o ficheiro for hibrido. Por exemplo começa com um cabeçalho de strings de 5 linhas (é um exemplo) e a seguir vem a tal matriz de dados.

import numpy as np
fid = open(caminho,'r')
for i in xrange(5): fid.readline()   # 5 Linhas de cabeçalho. repara que é readline e não readlines, e por isso singular. Cada instrução readline lê apenas uma linha em ordem sequencial.
matriz = np.loadtxt(fid, dtype='float32')  # Já agora repara que lhe estou a dizer para ocupar 32 bits de espaço por cada elemento em formato float.
fid.close()

Ainda há a última hipótese que é o ficheiro ser complexo com números e strings pelo meio mas nesse caso é necessário fazer um parser adequado a cada caso.

Share this post


Link to post
Share on other sites
Psycho_Mind

@Pedro C., obrigado pelas dicas, terei ainda de testar, mas assim de repente, o que indicas não está apenas a ler e obter o conteúdo do ficheiro (ou estou em erro ?), que era o que já estava a utilizar.

Share this post


Link to post
Share on other sites
Pedro C.

Ops. Na altura em que li o teu post assumi que estavas a tentar trabalhar com o conteúdo dos ficheiros. É o mau hábito de ler as coisas na diagonal.

De facto na forma em que meteste a tua questão não percebo bem o objectivo.

O que eu assumo que o FileDialog do Tkinter te esteja a dar (com o "askopenfilename") é uma string e nada tem a ver com o ficheiro em si. A partir desse ponto podes trabalhar essa string (como referiste para ficar apenas com o nome do ficheiro) ou usá-la directamente.

A título de pormenor repara que todos os programar partem de uma "working directory" que, por defeito, é o caminho onde se encontra a fonte do programa. Por esse motivo se tiveres o teu programa em:

c:\programas\meu_programa\

e tentares abrir o ficheiro:

c:\ficheiros\meu_ficheiro.txt

Ele vai conseguir fazê-lo porque tem a morada completa do que tu pretendes. Se tentares antes abrir apenas a partir do nome do ficheiro...

meu_ficheiro.txt

O teu software vai tentar ler o seguinte caminho:

c:\programas\meu_programa\meu_ficheiro.txt

E não resultando tentar ler o caminho directamente. Ambas hipóteses vão returnar nulo neste caso.

Se o que pretendes trabalhar é o "working directory" podes usar o módulo "os" (https://docs.python.org/2/library/os.html), por exemplo. Para saberes o caminho da tua working directory podes fazer [ print os.getcwd() ] e para determinares a tua working directory pode fazer [ os.chdir(caminho) ].

Se por outro pretendes mexer com os caminho então podes usar na mesma o módulo "os" com o seu sub-módulo "path" (https://docs.python.org/2/library/os.path.html). Tens funções para tudo e mais alguma coisa para gerires a string e informação do ficheiros (datas, tamanhos, etc.) sem teres que o abrir propriamente.

Share this post


Link to post
Share on other sites
Psycho_Mind

Em particular o que estou a fazer são cifras sobre ficheiros (neste caso em particular cifra simétrica), já consegui implementar tudo o que é necessário para as cifras (simétricas e assimétricas), mas como indiquei inicialmente estava a fazer para o conteúdo do ficheiro, visto ter sido o que consegui na altura (devido à limitaçao de conhecimentos e a fim de não perder tempo) e foi assim que fui efetuando todos os testes. Uma vez que ja consigo aplicar as cifras/decifras, preciso de o fazer sobre os ficheiros e não sobre o seu conteudo.

Em baixo exemplo da leitura do conteudo do ficheiro e cifra com chave simétrica do mesmo, sendo que o que preciso é aplicar essa mesma cifra sobre o ficheiro.

filename1 = raw_input("Insert file name: ")
with open(filename1,'rb') as f:
   s = f.read()

data1 = s


# insert password to create key

password1 = raw_input('Enter password (symmetric key): ')

# generate 16bytes (AES-128) key from inserted password
h1 = SHA256.new()
h1.update(password1)
key1 = h1.digest()[0:16]
#print key1.encode('hex')

# generate initialization 16bytes vector
iv1 = Random.new().read(16)

# criptogram creation (cipher data)
cipher1 = AES.new(key1, AES.MODE_CFB, iv1)
criptogram1 = iv1 + cipher1.encrypt(data1)

O problema passa assim não pelo caminho para o ficheiro ou diretorios, mas a forma de conseguir 'obter' o ficheiro em si e poder aplicar o que necessito.

Share this post


Link to post
Share on other sites
Psycho_Mind

Relativamente à leitura de ficheiros penso que algo do genero será uma possivel solução.

A alguem que possa ser util aqui fica:

#read binary file to get bytes 
   while True:
       buf = fo.read(1024) #read 1024bytes from the file on each iteration of the loop 
       if len(buf) == 0:
            break

   fo.close()

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

×
×
  • 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.