【问题标题】:Slice variable from specified letter to specified letter in line that varies in length将变量从指定字母切片到长度不同的行中的指定字母
【发布时间】:2016-09-18 07:09:38
【问题描述】:

网站新手,如果格式不正确,我深表歉意。

所以我正在文件中搜索包含

的行

Server[x] ip.ip.ip.ip response=235ms accepted....

其中 x 可以是任何大于或等于 0 的数字,然后将该信息存储在名为 line 的变量中。

然后,我将此内容打印到tkinter GUI,它的窗口信息太多。

为了解决这个问题,我想我会在函数中使用 return line[15:30] 将信息切分,但我想从这些行中删除的信息并不总是介于 15 到 30 之间。

为了解决这个问题,我尝试使用

进行循环

return line[cnt1:cnt2]

在循环中检查cnt1cnt2,直到cnt1 遇到“S”和cnt2 遇到“a”,从接受。

问题是我是 Python 新手,无法让循环正常工作。

def serverlist(count):
    try:
        with open("file.txt", "r") as f:
            searchlines = f.readlines()
        if 'f' in locals():
            for i, line in enumerate(reversed(searchlines)):
                cnt = 90
                if "Server["+str(count)+"]" in line:
                    if line[cnt] == "t":
                        cnt += 1
                    return line[29:cnt]
    except WindowsError as fileerror:
        print(fileerror)

我在行阅读时做了reversed,因为我正在寻找的行在文本文件中每隔几分钟就会重复一遍。

最初我想从底部扫描并在到达server[0] 时停止,但这个循环也不适用于我。

我放弃并开始只运行serverlist(count) 并指定我正在寻找的服务器编号,而不是仅仅运行serverlist()

希望当我了解原始循环的问题后,我可以解决此问题。

此处的最终目标

file.txt 多行带有

<timestamp/date> Server[x] ip.ip.ip.ip response=<time> accepted <unneeded garbage>

我只想从该行中删除Server[x] 和响应时间,并使用变量将其显示在其他地方。

该行的范围可以从Server[0]Server[999] 并且每隔几分钟检查一次相同的响应时间,因此我需要避免重复并且只在日志底部获取最新条目。

抱歉,这篇文章冗长且令人困惑。


编辑:

以下是我一直认为应该有效但无效的方法:

def serverlist():
ips = []
cnt = 0
with open("file.txt", "r") as f:
    for line in reversed(f.readlines()):
        while cnt >= 0:
            if "Server["+str(cnt)+"]" in line:
                ips.append(line.split()) # split on spaces
                cnt += 1
return ips

我的测试日志文件有 server[4] 到 server[0]。我认为上面会从文件底部读取,打印 server[4] 行,然后 server[3] 行等,并在它达到 0 时停止。理论上这会阻止它读取文件中的每一行(运行速度更快)它只会给我最新的数据。但是当我使用while cnt >=0 运行它时,它会陷入循环并永远运行。如果我使用任何其他值(例如 1 或 2)运行它,那么它会返回一个空白列表 []。我想我误解了这将如何工作。

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    这是我的第一种方法:

    def serverlist(count):
        with open("file.txt", "r") as f:
            for line in f.readlines():
                if "Server[" + str(count) + "]" in line:
                    return line.split()[1] # split on spaces
        return False
    
    print serverlist(30)
    # ip.ip.ip.ip
    
    print serverlist(";-)")
    # False
    

    您可以更改line.split()[1]中的索引以获取该行的特定空格分隔字符串。


    编辑:当然,只要去掉 if 条件就可以得到所有的 ip:

    def serverlist():
        ips = []
        with open("file.txt", "r") as f:
            for line in f.readlines():
                if line.strip().startswith("Server["):
                    ips.append(line.split()[1]) # split on spaces
        return ips
    

    【讨论】:

    • 这是一个非常棒的解决方案,可以减少我需要的数据。我能够将索引更改为 3:6 以获得我需要的内容。是否可以将循环添加到函数中,以便在一个查询中为我提供所有结果?因为它只返回 server[30] 的结果。
    • 这不会只提取带有“Server[x]”的行,因此它会返回文件中包含太多信息的所有内容。澄清一下:有了第一个解决方案,我可以运行 serverlist(0)、serverlist(1)、serverlist(2) 等来获取我想要的值,但如果我有 99 台服务器,这需要大量输入。我只想运行 serverlist() 并将每台服务器的信息输出到我的 GUI,但只有一次,并且只有文件底部的条目,所以我知道它们是最新信息。
    • 我又编辑了一遍。文件中的数字是否唯一?
    • 这并没有在列表中添加任何内容。我是这样做的: 'def serverlist(): ips = [] with open("file.txt", "r") as f: for line in f.readlines(): if "Server[" in line: ips .append(line.split()[3:6]) # split on spaces return ips ' 这给了我每个项目,但由于这些行在日志中重复,它将显示 server[1] 的 40 个结果。从底部搜索时,我需要让它在到达第一个服务器 [0] 时停止。这样它就可以得到最新的响应时间检查。
    • 我如何在上面的代码看起来并不混乱的地方显示?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    相关资源
    最近更新 更多