Ler arquivos significa que vamos carregar o arquivo na memória do programa, e ler linha por linha o conteúdo do arquivo.
Para fazer isso, precisamos apenas de alguns passos:
import argparse
from argparse import ArgumentParser
Esses são os imports necessários para usar o argparse
, que é um módulo do Python para ler argumentos enviados através
da linha de comando.
Primeiro, vamos identificar quais são esses parâmetros no nosso código:
parser = ArgumentParser(description="Read file form Command line.")
parser.add_argument("-i", "--input", dest="filename", required=True, type=validate_file,
help="input file", metavar="FILE")
parser.add_argument("-o", "--output", dest="outputname",
required=True, help="output file")
args = parser.parse_args()
Nas linhas de parser.add_argument
, estamos falando ao programa que, ao ser executado, um argumento será enviado junto com ele.
parser.add_argument("-i", "--input", dest="filename", required=True, help="input file", metavar="FILE")
Nessa linha, estamos falando que enviaremos um argumento -i ou --input, que é o nome de um arquivo, e que ele é um argumento
obrigatório (required=True
).
A mesma cousa para a linha de baixo, mudando o nome e a descrição do argumento.
Com isso adicionado no código, já podemos executar o programa da seguinte forma:
$ python programa.py -i input.txt -o output.txt
Ao fazer isso, você consegue acessar eles no código da seguinte forma: args.filename
no caso do input, args.outputname
no caso
do output.
Depois disso, o que nos resta, no caso do input, é ler o arquivo. Assumindo que você tenha passado um arquivo .txt no argumento, você consegue fazer a leitura da seguinte forma:
with open(args.filename, "r") as file:
stripped_line = file.readline().strip().split()
nV = int(stripped_line[0])
G = [[0 if i == j else INF for j in range(nV)] for i in range(nV)]
for line in file:
stripped_line = line.strip().split()
u, v, w = [int(i) for i in stripped_line]
G[u-1][v-1] = G[v-1][u-1] = w
open()
é a função padrão do Python para ler arquivos. Quando fazemos with open(args.filename, "r") as file
,
quer dizer que estamos abrindo um arquivo, no modo apenas leitura (é o que significa o "r" nos parâmetros), e que
ele terá o nome de file
.
Com isso, podemos fazer os métodos padrões de file.readLine()
que irá nos retornar a linha atual (começando da primeira)
do arquivo, que é uma string. Após isso, no caso desse programa, executamos o strip()
para remover espaços no começo
ou no final da linha, e por fim, o split()
que irá transformar a string em uma lista, separada por espaços padrões (espaços em branco ou tabs)
Com isso, podemos inicializar o grafo, e definir também o número de vértices nV
.
Após isso, passamos linha por linha no arquivo, dentro do loop, para inserir os pontos no grafo.
O código final, então, fica dessa forma:
import argparse
from argparse import ArgumentParser
parser = ArgumentParser(description="Read file form Command line.")
parser.add_argument("-i", "--input", dest="filename", required=True,
help="input file", metavar="FILE")
parser.add_argument("-o", "--output", dest="outputname",
required=True, help="output file")
args = parser.parse_args()
G = None
nV = 0
INF = 999999
with open(args.filename, "r") as file:
stripped_line = file.readline().strip().split()
nV = int(stripped_line[0])
G = [[0 if i == j else INF for j in range(nV)] for i in range(nV)]
for line in file:
stripped_line = line.strip().split()
u, v, w = [int(i) for i in stripped_line]
G[u-1][v-1] = G[v-1][u-1] = w