代码之家  ›  专栏  ›  技术社区  ›  user44791

Python是根据输入变量操作字符串的好方法

  •  2
  • user44791  · 技术社区  · 3 年前

    抱歉,如果标题有点模糊。我现在就解释一下。 我的设想如下: 我正在读一个cfg文件,每个部分都会收到一本字典。例如: 配置文件:

    [General]
    parameter1="Param1"
    parameter2="Param2"
    
    [FileList]
    file001="file1.txt"
    file002="file2.txt" ......
    

    现在,让我们关注文件列表部分,它保存为字典。在这个例子中,我可以访问“file1.txt”作为 test = section["file001"] 所以 test = "file1.txt" .现在,当我想逐个访问文件列表中的每个文件时,我可以尝试以下方法:

    i = 1
    for i in range(1, (number_of_files + 1)):
        access_key = str("file_00" + str(i))
        print(section[access_key])
    

    现在,这是我目前的解决方案,我一点都不喜欢。首先,它在python中看起来有点凌乱,但当配置中列出9个以上的文件时,我也会遇到问题。 我可以这样做:

    i = 1
    for i in range(1, (number_of_files + 1)):
        if (i <= 9):
            access_key = str("file_00" + str(i))
        elif (i > 9 and i < 100):
            access_key = str("file_0" + str(i))
        print(section[access_key])
    

    但我不想从那开始,因为情况会变得更糟。所以我的问题是:怎样做才是正确且相对干净的方法?我肯定需要“循环访问”,因为我需要对每个文件执行一些操作。

    3 回复  |  直到 3 年前
        1
  •  2
  •   bob    3 年前

    使用零填充生成文件号(例如,请参见此问题答案: https://stackoverflow.com/a/339013/3775361 )。这样,您就不必自己编写数字滚动的逻辑,您可以使用内置的Python功能来完成。如果您正在使用Python 3,我也建议您尝试f-strings(上面链接中建议的解决方案之一)。他们太棒了!

        2
  •  1
  •   Kota Mori    3 年前

    如果我们可以假设文件号有三位数字,那么您可以执行以下操作来实现零填充。以下所有选项都返回“015”。

    i = 15
    
    str(i).zfill(3)
    # or
    "%03d" % i 
    # or
    "{:0>3}".format(i)
    # or
    f"{i:0>3}"
    
        3
  •  0
  •   Mad Physicist    3 年前

    从你实际拥有的钥匙开始,而不是猜测它们可能是什么。你需要过滤掉那些与你的模式相匹配的,并根据数字部分进行排序。

    keys = [key for key in section.keys() if key.startswith('file') and key[4:].isdigit()]
    

    您可以添加其他条件,例如 len(key) > 4 ,或完全放弃这些条件。您也可以考虑学习正则表达式以使检查更加优雅。

    要在不考虑填充的情况下对名称进行排序,可以执行以下操作

    keys = sorted(keys, key=lambda s: int(s[4:]))
    

    您还可以尝试natsort这样的库,它将更普遍地处理自定义排序键。

    现在,您可以迭代键并执行任何您想要的操作:

    for key in sorted((k for k in section.keys() if k.startswith('file') and k[4:].isdigit()), key=lambda s: int(s[4:])):
        print(section[key])