Python E/S - Criando, Lendo e Escrevendo Arquivos no Adessowiki

Este tutorial tem como objetivo apresentar os primeiros passos para criar, acessar e manipular arquivos no ambiente Adessowiki através do código Python.

O mais importante sobre a gravação e leitura de arquivos no Adessowiki é obter o caminho absoluto para o arquivo. Para gravar um novo arquivo, utilize a função get_attachment_path. Para ler ou modificar um arquivo existente, utilize a função find_attachment_file. Dado o caminho absoluto para o arquivo, qualquer dos procedimentos de leitura e gravação de arquivos do python deve funcionar normalmente.

Os arquivos criados no Adessowiki são armazenados na área destinada aos anexos da página, lembrando que um página está sempre associada a um namespace.

get_attachment_path() e find_attachment_file()

A função que retorna o caminho completo do local onde o arquivo será salvo é o get_attachment_path(arquivo), onde o argumento arquivo é uma string com o nome do arquivo.

Exemplo: o código abaixo mostra o caminho retornado com a função get_attachment_path :

1 print get_attachment_path('teste.txt')
/awmedia/www/media/Attachments/Ajuda/pythonIO/teste.txt

Observe acima que o caminho retornado inclui o nome do namespace e também o nome desta página.

Para fazer a leitura do arquivo criado ou de qualquer arquivo anexado à pagina, é necessário o caminho completo de onde está o arquivo que pode ser obtido com a função find_attachment_file:

A função find_attachment_file(arquivo) busca o arquivo que se quer ler na pasta de anexos e retorna o caminho completo. Neste caso o argumento será apenas 'nome_do_arquivo' .

Caso necessite abrir um arquivo que é anexo de uma outra página que está no mesmo namespace da atual, deve-se passar como argumento: 'nome_da_página/nome_do_arquivo'.

Caso o arquivo esteja em outro namespace, deve-se passar também o nome do namespace, desta forma: 'namespace/nome_da_página/nome_do_arquivo'

Veja os exemplos abaixo:

1 print find_attachment_file('teste.txt')
2 print find_attachment_file('MainPage/blackberrycool_qr_code.png')
3 print find_attachment_file('Ajuda/MainPage/blackberrycool_qr_code.png')
/awmedia/www/media/Attachments/Ajuda/pythonIO/teste.txt
/awmedia/www/media/Attachments/Ajuda/MainPage/blackberrycool_qr_code.png
/awmedia/www/media/Attachments/Ajuda/MainPage/blackberrycool_qr_code.png

ATENÇÃO: Apesar destes arquivos ficarem gravados na área de anexos (attachments), eles não são visíveis na aba de anexos do Adessowiki.

Observe também que caso o arquivo não exista, a função find_attachment_file retorna erro:

Criando arquivo

Para criar um arquivo utilizando o código python no Adessowiki basta utilizar a função open, devendo passar o nome do arquivo com o caminho completo e o argumento 'w', indicando escrita. A forma mais usual é criar uma variável a partir da função open. Veja o exemplo:

1 filen = get_attachment_path('teste.txt')
2 print 'filen=',filen
3 arq = open(filen,'w')
filen= /awmedia/www/media/Attachments/Ajuda/pythonIO/teste.txt

Para escrever no arquivo, deve-se acrescentar o atributo .write() à variável criada. A informação a ser escrita no arquivo será o argumento da função write() :

1 arq.write("Esta é a primeira linha.")
2 arq.write("\nEsta é a segunda linha.")

Importante: caso o arquivo já exista, ao passar a opção 'w', o mesmo será sobreescrito.

Também é recomendado fechar o arquivo após finalizado a escrita, através do atributo .close(), da seguinte forma:

1 arq.close()

Lendo o arquivo

Para ler o arquivo também faz-se uso da função open(), porém deve ser passado o argumento 'r' ao invés de 'w'. Para indicar o caminho completo do arquivo será usado a função find_attachment_file(). Veja o exemplo:

1 lerarq = open(find_attachment_file('teste.txt'),'r')

O contéudo completo do arquivo, na forma string, pode ser acessado através do atributo .read().

1 print lerarq.read()
2 lerarq.close()
Esta é a primeira linha.
Esta é a segunda linha.

Acrescentando dados ao arquivo

Também é possível abrir um arquivo para acrescentar dados ao mesmo. Neste caso deve-se utilizar a função open() com o arqgumento 'a'. Veja o exemplo,

1 altarq = open(find_attachment_file('teste.txt'),'a')
2 altarq.write("\nEsta agora é a terceira linha.")
3 altarq.close()
4 
5 lerarq = open(find_attachment_file('teste.txt'),'r')
6 print lerarq.read()
7 lerarq.close()
Esta é a primeira linha.
Esta é a segunda linha.
Esta agora é a terceira linha.

Ler e Gravar uma imagem no ambiente Adessowiki

Os arquivos do attachment do Adessowiki podem ser para qualquer propósito. Em particular, para guardar arquivos de imagens, utilizamos as funções adread e adwrite que foram modificadas do package adpil ou ainda podemos ler as imagens como dados texto conforme exemplo abaixo utilizando as funções savetxt e loadtxt do numpy.

Lendo uma imagem do attachments

É possível carregar uma imagem na forma de attachment utilizando-se a aba "attachments" superior do Adessowiki. Uma vez que a imagem está carregada, é possível lê-la utilizando-se o adread:

1 f = adread(find_attachment_file('barcode.png'))
2 adshow(f,'imagem lida do attachment')

imagem lida do attachment

A função adread já busca as imagens nos anexos, portanto é possível simplificar o código acima e omitir a chamada ao find_attachment_file. Veja o exemplo:

1 f = adread('barcode.png')
2 adshow(f,'barcode.png')
3 g = adread('MainPage/blackberrycool_qr_code.png')
4 adshow(g,'MainPage/blackberrycool_qr_code.png')

barcode.png

MainPage/blackberrycool_qr_code.png

Utilizando o adwrite

A gravação de uma imagem no Adessowiki pode ser feita com a função adwrite() da toolbox adpil, já carregada no ambiente do Adessowiki. A forma de utilização da função é bem simples e está exemplificada abaixo. Importante destacar que o formato do arquivo é determinada pela extensão dada ao nome do arquivo:

 1 import numpy as np
 2 
 3 A = zeros((20,256))
 4 A[:,:] = np.arange(256).reshape(1,256)
 5 
 6 adwrite(get_attachment_path('imgteste.tif'),A)
 7 img = adread(find_attachment_file('imgteste.tif'))
 8 print 'shape:',img.shape
 9 print img
10 adshow(img)
shape: (20, 256)
[[  0   1   2 ..., 253 254 255]
 [  0   1   2 ..., 253 254 255]
 [  0   1   2 ..., 253 254 255]
 ..., 
 [  0   1   2 ..., 253 254 255]
 [  0   1   2 ..., 253 254 255]
 [  0   1   2 ..., 253 254 255]]

Gravando e lendo a imagem em txt

Vamos fazer um exemplo que grava um ndarray do numpy no formato texto e posteriormente realiza a sua leitura, utilizando as funções savetxt e loadtxt do numpy.

 1 import numpy as np
 2 
 3 A = np.array([[5, 1, 7, 9, 8],
 4               [2, 7, 8, 6, 5],
 5               [7, 1, 3, 3, 4],
 6               [6, 5, 1, 7, 5]])
 7 
 8 print "Matriz original:\n", A
 9 
10 filepath = get_attachment_path("matriz_a.csv")
11 print "\n\nCaminho do arquivo:", filepath
12 
13 # Vamos gravar o arquivo
14 np.savetxt(filepath, A, delimiter=',', fmt='%d')
15 
16 # Agora vamos ler o arquivo em uma variável diferente
17 B = np.loadtxt(filepath, delimiter=',', dtype='int')
18 
19 print "\n\nMatriz lida:\n", B
Matriz original:
[[5 1 7 9 8]
 [2 7 8 6 5]
 [7 1 3 3 4]
 [6 5 1 7 5]]


Caminho do arquivo: /awmedia/www/media/Attachments/Ajuda/pythonIO/matriz_a.csv


Matriz lida:
[[5 1 7 9 8]
 [2 7 8 6 5]
 [7 1 3 3 4]
 [6 5 1 7 5]]

Contribuições:

  • Francislei José da Silva, 5 de abril de 2013
  • André Luis da Costa, 5 de abril de 2013