【问题标题】:How should I modify code responsible for looping through .txt file in order to get into sub-loops我应该如何修改负责循环 .txt 文件的代码以进入子循环
【发布时间】:2019-12-30 14:06:47
【问题描述】:

我写了一些代码,逐行分析 .txt 文件,但是写的很糟糕。目前我有脑雾,我的代码有问题,我的 txt 文件最后需要空行才能创建正确的最后一组。如果没有此行功能,则将最后一组的名称设置为与前一个相同,从而导致进一步的问题。

txt 文件如下所示:

time in seconds
addr1,channel1
addr2,channel2
staticval1,channel3
staticval2,channel4
groupname1
addr3,channel5
staticval3,channel6
groupname2

etc


1
239.0.1.104,kanal1
233.51.52.170,kanal2
239.0.1.105,kanal3
1.0,kanal4
2.0,kanal5
grupa12
239.0.1.122,kanal6
239.0.1.116,kanal7
1.5,kanal8
4.5,kanal9
grupa123
239.0.1.119,kanal10
239.0.1.112,kanal11
4.5,KANAL112
4.0,KANAL123
1.5,KANAL134
grupa1234

代码是:

with open("INPUT_DATA_SIMULATION.txt", "r") as filestream:
    for line in islice(filestream, 0, 1):
        scanTime = int(line)
    for line in filestream:
        currentline = line.split(",")
        if not "grupa" in line: 
            #walk thorugh lines inbetween "groups"
            if(currentline != ["\n"]):
                for y in range(len(currentline[0])):
                    if(currentline[0][y] == "."):
                        valChecker += 1
                if(valChecker>=2):
                    MCAST_ADDRESSES.append(currentline[0])
                elif(valChecker<=1):
                    MCAST_VALUES.append(float(currentline[0]))
                valChecker = 0
                if("\n" in currentline[1]):
                    currentline[1] = currentline[1][:-1]
                    MCAST_NAMES.append(currentline[1])
                else:
                    MCAST_NAMES.append(currentline[1])
            #if blank line found break loop
            else:                
                break
        elif "grupa" in line:
            groupName = line[:-1]
            shouldAdd = True
        if(shouldAdd):
            MCAST_GRP.append(groupName)
            MCAST_GRP.append(MCAST_ADDRESSES)
            MCAST_GRP.append(MCAST_VALUES)
            MCAST_GRP.append(MCAST_NAMES)

            MCAST_GROUPS.append(MCAST_GRP)

            MCAST_GRP = []
            MCAST_ADDRESSES = [] 
            MCAST_VALUES = []
            MCAST_NAMES  = []
            shouldAdd = False

return MCAST_GROUPS, scanTime

我应该如何修改代码以输入格式:

time in seconds
groupname1
addr1,channel1
static1,channel2
groupname2
addr2,channel3

所以组名在地址和静态值之前,而不是之后?还可以修改负责删除行尾“\n”的部分。

提前谢谢你。

【问题讨论】:

    标签: python loops text-files


    【解决方案1】:

    根据要求创建了两个版本

    • get_input-handles 每组后的组名
    • get_rev_input-handle 每个组之前的组名

    代码遵循原始流程,但进行了一些清理

    在每个组之后处理组名

    from itertools import islice
    import re
    import pprint
    
    def get_input(filepath):
        with open(filepath, "r") as filestream:
            MCAST_ADDRESSES = []
            MCAST_NAMES = []
            MCAST_VALUES = []
            MCAST_GRP = []
            MCAST_GROUPS = []
    
            # Various line patterns (capture using regex)
            mcast_pattern = re.compile(r"(^(\d{1,3}\.){3}\d{1,3}),(\w+)", re.IGNORECASE)
            number_pattern = re.compile(r"(^(^\d+\.\d+),(\w+))$", re.IGNORECASE)
            number_pattern = re.compile(r"((^\d+\.\d+),(\w+))$", re.IGNORECASE)
            group_pattern = re.compile(r"(grupa\d+)$", re.IGNORECASE)
    
            for line in islice(filestream, 0, 1):
                scanTime = int(line)
    
            for line in filestream:
                currentline = line.rstrip() # strips off ending "/n"
    
                search = group_pattern.search(currentline)
    
                if not search: 
                    search = mcast_pattern.search(currentline)
                    if search:
                        MCAST_ADDRESSES.append(search.group(1)) # ID
                        MCAST_NAMES.append(search.group(3))      # Name
    
                    search = number_pattern.search(currentline)
                    if search:
                        MCAST_VALUES.append(search.group(2))
                        MCAST_NAMES.append(search.group(3))         
    
                else:
                    groupName = search.group(1)
                    MCAST_GRP.append(groupName)
                    MCAST_GRP.append(MCAST_ADDRESSES)
                    MCAST_GRP.append(MCAST_VALUES)
                    MCAST_GRP.append(MCAST_NAMES)
    
                    MCAST_GROUPS.append(MCAST_GRP)
    
                    MCAST_GRP = []
                    MCAST_ADDRESSES = [] 
                    MCAST_VALUES = []
                    MCAST_NAMES  = []
    
    
        return MCAST_GROUPS, scanTime
    

    用法

    data, scanTime = get_input(r".\input_simulation\INPUT_DATA_SIMULATION.txt")
    
    print("Scan time: {}".format(scanTime))
    pp = pprint.PrettyPrinter(indent=4)
    pp.pprint(data)
    

    输出

    Scan time: 1
    [   [   'grupa12',
            ['239.0.1.104', '233.51.52.170', '239.0.1.105'],
            ['1.0', '2.0'],
            ['kanal1', 'kanal2', 'kanal3', 'kanal4', 'kanal5']],
        [   'grupa123',
            ['239.0.1.122', '239.0.1.116'],
            ['1.5', '4.5'],
            ['kanal6', 'kanal7', 'kanal8', 'kanal9']],
        [   'grupa1234',
            ['239.0.1.119', '239.0.1.112'],
            ['4.5', '4.0', '1.5'],
            ['kanal10', 'kanal11', 'KANAL112', 'KANAL123', 'KANAL134']]]
    

    在组之前处理组名

    from itertools import islice
    import re
    import pprint
    
    def get_rev_input(filepath):
        with open(filepath, "r") as filestream:
            MCAST_ADDRESSES = []
            MCAST_NAMES = []
            MCAST_VALUES = []
            MCAST_GRP = []
            MCAST_GROUPS = []
    
            # Various line patterns (capture using regex)
            mcast_pattern = re.compile(r"(^(\d{1,3}\.){3}\d{1,3}),(\w+)", re.IGNORECASE)
            number_pattern = re.compile(r"((^\d+\.\d+),(\w+))$", re.IGNORECASE)
            group_pattern = re.compile(r"(grupa\d+)$", re.IGNORECASE)
    
            for line in islice(filestream, 0, 1):
                scanTime = int(line)
    
            groupName = ""
            for line in filestream:
                currentline = line.rstrip() # strips off ending "/n"
    
                search = group_pattern.search(currentline)
    
                if not search: 
                    # Not groupname
                    search = mcast_pattern.search(currentline)
                    if search:
                        MCAST_ADDRESSES.append(search.group(1)) # ID
                        MCAST_NAMES.append(search.group(3))      # Name
    
                    search = number_pattern.search(currentline)
                    if search:
                        MCAST_VALUES.append(search.group(2))
                        MCAST_NAMES.append(search.group(3))         
    
                else:
                    if not groupName:
                        groupName = search.group(1)
                        continue
    
                    MCAST_GRP.append(groupName)
                    MCAST_GRP.append(MCAST_ADDRESSES)
                    MCAST_GRP.append(MCAST_VALUES)
                    MCAST_GRP.append(MCAST_NAMES)
                    MCAST_GROUPS.append(MCAST_GRP)
    
                    MCAST_GRP = []
                    MCAST_ADDRESSES = [] 
                    MCAST_VALUES = []
                    MCAST_NAMES  = []
    
                    # Update group name
                    groupName = search.group(1)
    
    
            # Capture Last Group
            if groupName:
                MCAST_GRP.append(groupName)
                MCAST_GRP.append(MCAST_ADDRESSES)
                MCAST_GRP.append(MCAST_VALUES)
                MCAST_GRP.append(MCAST_NAMES)
                MCAST_GROUPS.append(MCAST_GRP)
    
        return MCAST_GROUPS, scanTime
    

    用法

    data, scanTime = get_rev_input(r".\input_simulation\revINPUT_DATA_SIMULATION.txt")
    
    print("Scan time: {}".format(scanTime))
    pp = pprint.PrettyPrinter(indent=4)
    pp.pprint(data)
    

    输出

    Scan time: 1
    [   [   'grupa12',
            ['239.0.1.104', '233.51.52.170', '239.0.1.105'],
            ['1.0', '2.0'],
            ['kanal1', 'kanal2', 'kanal3', 'kanal4', 'kanal5']],
        [   'grupa123',
            ['239.0.1.122', '239.0.1.116'],
            ['1.5', '4.5'],
            ['kanal6', 'kanal7', 'kanal8', 'kanal9']],
        [   'grupa1234',
            ['239.0.1.119', '239.0.1.112'],
            ['4.5', '4.0', '1.5'],
            ['kanal10', 'kanal11', 'KANAL112', 'KANAL123', 'KANAL134']]]
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2020-11-11
    • 2021-08-04
    相关资源
    最近更新 更多