Py学习  »  Python

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

user44791 • 3 年前 • 1453 次点击  

抱歉,如果标题有点模糊。我现在就解释一下。 我的设想如下: 我正在读一个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])

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/131058
 
1453 次点击  
文章 [ 3 ]  |  最新文章 3 年前
Mad Physicist
Reply   •   1 楼
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])
Kota Mori
Reply   •   2 楼
Kota Mori    3 年前

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

i = 15

str(i).zfill(3)
# or
"%03d" % i 
# or
"{:0>3}".format(i)
# or
f"{i:0>3}"
bob
Reply   •   3 楼
bob    3 年前

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