Skip to content

Instantly share code, notes, and snippets.

@lucasheriques
Last active September 7, 2020 19:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lucasheriques/f2c120963d96090cffe605f707557ae8 to your computer and use it in GitHub Desktop.
Save lucasheriques/f2c120963d96090cffe605f707557ae8 to your computer and use it in GitHub Desktop.
Como ler arquivos usando Python e argparse

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment