open() e método close().read(), readline() e readlines().for linha in arquivo:.write().Abaixo é mostrado um possível exemplo de arquivo de uma planilha no formato do CSV, contendo três alunos e suas respectivas notas das três provas:
Abaixo é apresentada uma solução:
def ordenacao(M):
n = len(M)
for n in range(len(M),1,-1):
imax = 0
for i in range(1,n):
if M[i][0] > M[imax][0]:
imax = i
tmp = M[n-1]
M[n-1] = M[imax]
M[imax] = tmp
def main():
#Leitura do arquivo de entrada
arquivo = open("notas.csv", 'r')
matriz = []
for linha in arquivo:
l = linha.strip()
if len(l) > 0:
palavras = l.split(";")
matriz.append(palavras)
arquivo.close()
ordenacao(matriz)
#Gravação do arquivo de saída
arquivo = open("notas2.csv", 'w')
n = len(matriz)
m = len(matriz[0])
for i in range(n):
for j in range(m-1):
arquivo.write(matriz[i][j])
arquivo.write(";")
arquivo.write(matriz[i][m-1])
arquivo.write("\n")
arquivo.close()
main()
Inicialmente, usamos a função open() para
abrir o arquivo de nome notas.csv para leitura, tal como indicado pelo
valor 'r' (do inglês read) do segundo parâmetro de open("notas.csv", 'r'). O arquivo notas.csv deve estar no mesmo diretório do programa sendo executado,
caso contrário devemos indicar explicitamente o caminho completo (path) do arquivo.
O comando for linha in arquivo: é então usado para
processar as linhas do arquivo, como se ele fosse uma lista de strings contendo as linhas do arquivo. Usamos o método strip() para eliminar o '\n' e demais caracteres considerados "brancos" (como o espaço e o tab) no início e final das linhas.
Adicionamos então na matriz as linhas não vazias do aquivo, como uma lista de palavras separadas por ; utilizando o método split(";").
Usamos então close para fechar o arquivo.
Para o exemplo fornecido, a seguinte matriz é obtida:
[['Paulo', '8.8', '5.7', '8.2'], ['Tiago', '5.4', '6.9', '10.0'], ['Luna', '5.0', '4.3', '5.7']]
A matriz é então ordenada pelo seu primeiro campo pela função ordenacao(). No exemplo, temos a seguinte matriz ordenada:
[['Luna', '5.0', '4.3', '5.7'], ['Paulo', '8.8', '5.7', '8.2'], ['Tiago', '5.4', '6.9', '10.0']]
A matriz ordenada é então gravada no disco. Para isso,
abrimos o arquivo de saída notas2.csv no modo gravação,
tal como indicado pelo valor 'w' (do inglês write) do segundo parâmetro
do comando open("notas2.csv", 'w').
O arquivo notas2.csv é gerado no mesmo diretório do programa sendo executado,
caso contrário devemos incluir todo o caminho (path) no seu nome.
Os elementos da matriz são gravados no disco usando
o método write(). Dado que o comando write()
não inclui automaticamente o caracter de quebra de linha,
devemos usar o "\n" explicitamente quando necessário.
Para o exemplo fornecido, temos o seguinte arquivo de saída:
Arquivos no formato CSV são reconhecidos pelo OpenOffice/LibreOffice e programas similares. Abaixo mostramos o arquivo gerado sendo aberto no LibreOffice:
n > 0, faça uma
função molduras_concentricas(n, v1, v2) que gera
uma matriz quadrada nxn preenchida
com um padrão de molduras concêntricas, alternando entre
os dois valores fornecidos (v1 e v2) e iniciando com o valor v1 na
posição central da matriz,
tal como apresentado nos exemplos abaixo.
Para n=5, v1=0, v2=1:
[[0, 0, 0, 0, 0], [0, 1, 1, 1, 0], [0, 1, 0, 1, 0], [0, 1, 1, 1, 0], [0, 0, 0, 0, 0]]
Para n=7, v1=0, v2=1:
[[1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 1], [1, 0, 1, 1, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1]]
Para n=15, v1=0, v2=1:
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1], [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1], [1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1], [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1], [1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
Solução:
#Cria matriz com m linhas e n colunas
def cria_matriz(m, n, valor):
M = []
for i in range(m):
linha = []
for j in range(n):
linha.append(valor)
M.append(linha)
return M
def molduras_concentricas(n, v1, v2):
M = cria_matriz(n, n, 0)
for i in range(n):
for j in range(n):
#dh = distancia horizontal ao centro
dh = n//2 - j
if dh < 0:
dh = -dh
#dv = distancia vertical ao centro
dv = n//2 - i
if dv < 0:
dv = -dv
if dh > dv:
if dh % 2 == 0:
M[i][j] = v1
else:
M[i][j] = v2
else:
if dv % 2 == 0:
M[i][j] = v1
else:
M[i][j] = v2
return M
def grava_PGM(M):
arquivo = open("fig01.pgm", 'w')
arquivo.write("P2\n")
m = len(M)
n = len(M[0])
arquivo.write("%d %d\n"%(n,m))
arquivo.write("255\n")
for i in range(m):
for j in range(n):
arquivo.write(" %3d"%(M[i][j]))
arquivo.write("\n")
arquivo.close()
def main():
n = int(input("Digite n: "))
M = molduras_concentricas(n, 0, 255)
grava_PGM(M)
main()
Invertendo o conteúdo das variáveis v1 e v2, obtemos uma imagem com o brilho invertido. Podemos gerar a gif animada abaixo, gravando essa segunda imagem em um arquivo fig02.pgm e usando o conversor de imagens do ImageMagick, executando no terminal o comando: convert -delay 10 *.pgm out.gif

A gif animada acima foi gerada usando n=101.
Que modificação você poderia fazer no código acima para obter molduras mais grossas como na figura abaixo?