Ler arquivos de um diretorio e somar [RESOLVIDO]

1. Ler arquivos de um diretorio e somar [RESOLVIDO]

LINER DE SOUZA SANTOS
linersantos

(usa Ubuntu)

Enviado em 09/05/2020 - 21:11h

Boa noite.
Tenho um diretorio com 1000 arquivos e cada arquivo tem uma matriz n x n (n = 100). Preciso escrever um codigo que leia essas matrizes e calcule a soma desses valores.
Escrevi um codigo mas ele nao consegue interpretar os itens de cada arquivo como variavel.
import glob, os
os.chdir("/home/liner/mattmusic/programas/LI")

for file in glob.glob("*.dat"):
print(file)
arquivo = open(file)
print(arquivo.read())
linha2 = arquivo.readline()
while linha2:
valor2 = linha2.split()
a=valor2[1]
print(arquivo.read())
linha2 = arquivo.readline()

Se alguem puder me ajudar seria otimo :)
ps: pode ser em C/C++ ou bash tb


  


2. MELHOR RESPOSTA

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 10/05/2020 - 17:11h

Se todos os arquivos tiverem o mesmo tamanho, vai dar certo:

import glob

#primeiro peguei todos os arquivos
files = []
for file in glob.glob("/home/portela/cursos/*.dat"): #observe o caminho
files.append(file)

#agora assumindo que todos os arquivos tem a mesma quantidade de linhas, fazemos a soma de cada linha de cada um dos arquivos, gerando a
# matriz de resultado
matriz = []
#usei o primeiro arquivo apenas para popular a matriz inicialmente
with open(files[0]) as f:
for line in f.read().splitlines():
matriz.append([int(x) for x in line.split()])

#agora os demais arquivos, somando cada coluna de cada linha à primeira matriz
for file in files[1:]:
with open(file) as f:
l=0
for line in f.read().splitlines():
c=0
for v in [int(x) for x in line.split()]:
matriz[l][c] += v
c += 1
l += 1

print(matriz)


3. Re: Ler arquivos de um diretorio e somar [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 09/05/2020 - 21:46h

Não entendi bem o conteúdo do arquivo, se precisar de mais ajuda manda um exemplo.

import glob

somas = []
for file in glob.glob("/tmp/*.dat"):
print(file)
with open(file) as f:
somas.append({"nome": file, "valor": 0})
for line in f.read().splitlines():
x1,x2 = line.split(';')
somas[-1]['valor'] += int(x1) + int(x2)
print(somas)



4. Re: Ler arquivos de um diretorio e somar [RESOLVIDO]

LINER DE SOUZA SANTOS
linersantos

(usa Ubuntu)

Enviado em 09/05/2020 - 21:54h

Ola, valeu por responder mas deu um erro :(
vou te mandar um exemplo de como sao os arquivos:
73 15 30
09 18 27
15 5 0

cada arquivo (que eu chamei de 0.dat, 1.dat etc sao matrizes como esta mas bem maiores rs
a msg de erro foi
x1,x2 = line.split(';')

ValueError: not enough values to unpack (expected 2, got 1)


5. Re: Ler arquivos de um diretorio e somar [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 09/05/2020 - 22:08h

então, comece a avaliar o erro que o interpretador lhe diz, ele favou sobre a quantidade de elementos do split são incompatíveis com o o x,2, porque sua linha tem 3, fiz um teste com 2.
Segue um "melhorado", mas não copie e cole apenas, tente entender, para que vc possa evoluir ele e corrigir os erros, caso apareçam.

import glob

somas = []
for file in glob.glob("/home/portela/cursos/*.dat"): #observe o caminho
print(file)
with open(file) as f:
somas.append({"nome": file, "valor": 0})
for line in f.read().splitlines():
somas[-1]['valor'] += sum([int(x) for x in line.split()]) # observe o que as linhas do codigo fazem
print(somas)



6. Re: Ler arquivos de um diretorio e somar [RESOLVIDO]

LINER DE SOUZA SANTOS
linersantos

(usa Ubuntu)

Enviado em 09/05/2020 - 22:55h

Valeu pela ajuda :)
Eu sou mto novato em python.
Mexia mais com C/C++ mas nao consegui oq eu preciso com esses codigos e me falaram q o python conseguiria.
Vi varios videos e li mto sites mas nao consegui nd :(
o codigo q vc passou funcionou mas na vdd oq eu preciso é que o resultado seja uma matriz resultante da soma das matrizes de cada arquivo.


7. Re: Ler arquivos de um diretorio e somar [RESOLVIDO]

Fábio Berbert de Paula
fabio

(usa Debian)

Enviado em 10/05/2020 - 00:58h

Raimundo por aqui, satisfação ler um post teu amigo!


8. Re: Ler arquivos de um diretorio e somar [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 10/05/2020 - 16:25h

opa, ando sumido mesmo.
...o codigo q vc passou funcionou mas na vdd oq eu preciso é que o resultado seja uma matriz resultante da soma das matrizes de cada arquivo.

Não entendi ainda, se precisa de mais ajuda, posta um exemplo da saída, não entendi se deve ser por arquivo ou do resultado de todos os arquivos.





9. Re: Ler arquivos de um diretorio e somar

LINER DE SOUZA SANTOS
linersantos

(usa Ubuntu)

Enviado em 10/05/2020 - 16:49h

Oi. Obrigado pela atencao :)
é o seguinte:
eu tenho um diretorio com 1000 arquivos (cujos nomes sao 0000.dat , 0001.dat ...ate 1000.dat. Cada um desses arquivos tem uma matriz 100 x 100. Oq eu preciso eh gerar um arquivo que tenha a soma total de todas essas matrizes.
e.g. com 3 arquivos arquivos:
00.dat
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
e o arquivo 01.dat:
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
e o arquivo 02.dat:
3 3 3 3
3 3 3 3
3 3 3 3
3 3 3 3

quero q o codigo gere um arquivo ('resultado.dat') q tenha a matriz soma:
resultado.dat
4 4 4 4
6 6 6 6
8 8 8 8
10 10 10 10
Mas na vdd oq eu tenho nao sao só 2 arquivos com matrizes 4x4. Eu tenho 1000 arquivos com matrizes 100x100 e quero um arquivo com a soma total.
Desde já agradeço a atenção :)


10. Re: Ler arquivos de um diretorio e somar [RESOLVIDO]

LINER DE SOUZA SANTOS
linersantos

(usa Ubuntu)

Enviado em 10/05/2020 - 18:16h

Cara, muito obrigado msm :) ele calculou a soma :)
agora soh uma coisa, vc sabe como exibir e gravar a matriz sem os colchetes?
por exemplo:
[[10 12]
18 21]]
eu queria q o codigo gravasse num arquivo e exibisse o resultado assim
10 12
18 21


11. Re: Ler arquivos de um diretorio e somar [RESOLVIDO]

LINER DE SOUZA SANTOS
linersantos

(usa Ubuntu)

Enviado em 10/05/2020 - 18:25h

Consegui achar:
m=np.array(matriz)

print(m)
with open("filename","w") as f:
f.write("\n".join(" ".join(map(str, x)) for x in (m)))

ai a saida fica
10 12
18 21
valeu cara :)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts