【问题标题】:File operations - filtering data from txt file in python文件操作——在python中从txt文件中过滤数据
【发布时间】:2021-03-15 12:27:42
【问题描述】:

这段代码工作正常,但太大了,我想知道是否有其他方法可以编写这段代码以使其更短。

 import openpyxl as excel
PATH = "/home/Fathima/workspace/training/"
ACCESS_LIST = []
def READ_CONFIG():
    FROM_ZONE = ""
    TO_ZONE = ""
    POLICY_NAME = ""
    SOURCE_ADDR = ""
    DESTINATION_ADDR = ""
    PORT = ""
    global PATH
    global ACCESS_LIST
    count = 0
    CONFIG_PATH=PATH+"hofwdcn05dcn_20210216(2).txt"
    fh = open(CONFIG_PATH, 'r')
    CONFIG_LINES=fh.readlines()
    config_lines_cnt = len(CONFIG_LINES)
    while count < config_lines_cnt:
        line = CONFIG_LINES[count].strip()
        if len(line) > 0:
            line_to_array = line.split(' ')
            if line.startswith('from-zone '):
                FROM_ZONE = line_to_array[1]
                TO_ZONE = line_to_array[3]
            elif line.startswith('policy '):
                POLICY_NAME = line_to_array[1]
            elif line.startswith('source-address '):
                SOURCE_ADDR = line_to_array[1].replace(";", "")
            elif line.startswith('destination-address '):
                DESTINATION_ADDR = line_to_array[1].replace(";", "")
            elif line.startswith('application '):
                PORT = line_to_array[1].replace(";", "")
            elif line.startswith('then {'):
                count = count+1
                line = CONFIG_LINES[count].strip()
                if line == "permit;":
                    dummy = { 'FROM_ZONE' : FROM_ZONE,'TO_ZONE' : TO_ZONE,'POLICY_NAME' : POLICY_NAME,'SOURCE_ADDR' : SOURCE_ADDR,'DESTINATION_ADDR' : DESTINATION_ADDR,'PORT' : PORT}
                    ACCESS_LIST.append(dummy)
                    FROM_ZONE = ""
                    TO_ZONE = ""
                    POLICY_NAME = ""
                    SOURCE_ADDR = ""
                    DESTINATION_ADDR = ""
                    PORT = ""
        count +=1
#MAIN PROGRAM STARTS FROM HERE
READ_CONFIG()
print(ACCESS_LIST)

这里我有一个很大的文件,需要如下格式的输出

[{ 从区域: 到区: 政策: 源地址: 目标地址: 应用: },{ 从区域: 到区: 政策: 源地址: 目标地址: 应用: }]

【问题讨论】:

  • 您缺少所有块的缩进,即函数、while 循环、条件。这使得很难遵循程序流程。
  • 我已经编辑了代码,请立即检查,提前感谢@DarrylG

标签: python


【解决方案1】:

有一个单独的相关网站用于审查工作代码,即StackExchange Code Review

也就是说,下面是一个更加 Pythonic 的代码流。我没有更改条件,因为它们很容易理解。

主要变化

  • 消除全局变量(不鼓励 - 仅用于特殊需要)
  • 使用文件上下文管理器(即在文件打开时使用“with block”)
  • 遍历文件而不是读取整个文件(允许处理任意大小的文件)
  • 使用 Python 变量和函数命名约定,即PEP 8
  • 移除 import openpyxl(未使用)

代码

def read_config(path):

    from_zone, to_zone, policy_name, source_addr, destination_addr, port = [''] * 6
    access_list = []

    with open(path + "hofwdcn05dcn_20210216(2).txt", 'r') as fh:
        for line in fh:
            line = line.strip()
            if line:
                line_to_array = line.split(' ')

                if line.startswith('from-zone '):
                    from_zone = line_to_array[1]
                    to_zone = line_to_array[3]
                elif line.startswith('policy '):
                    policy_name = line_to_array[1]
                elif line.startswith('source-address '):
                    source_addr = line_to_array[1].replace(";", "")
                elif line.startswith('destination-address '):
                    destination_addr = line_to_array[1].replace(";", "")
                elif line.startswith('application '):
                    port = line_to_array[1].replace(";", "")
                elif line.startswith('then {'):
                    line = next(fh).strip()  # Gets next line in file
                    if line == "permit;":
                        access_list.append({'FROM_ZONE': from_zone,
                                            'TO_ZONE': to_zone,
                                            'POLICY_NAME': policy_name,
                                            'SOURCE_ADDR': source_addr,
                                            'DESTINATION_ADDR': destination_addr,
                                            'PORT': port})

                        from_zone, to_zone, policy_name, source_addr, destination_addr, port = [''] * 6
    return access_list

access_list = read_config("/home/Fathima/workspace/training/")
print(access_list)

【讨论】:

  • 非常感谢,像专业人士一样工作,代码最少
  • @Tahera——很高兴它有帮助。不要忘记按what to do when someone answers my question 投票和/或接受答案
  • 完成,我想知道为什么我们在代码中乘以 6
  • @Tahera--这两个实例正在使用复制列表的unpacking,即replicating elements in list[''] * 6 创建一个包含 6 个空字符串的列表,即 ['', '', '', '', '', ''],其元素被解压缩到变量 from_zone, to_zone, 等中。这有帮助吗?
  • 有类似类型的解决方案我正在寻找另一个 txt 文件,stackoverflow.com/q/66655050/15398942 请检查您是否可以帮助@DarryIG
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多