百分比完整计算:如果是整数则显示为整数,否则显示小数

Percentage-complete calculation: display as integer if whole number, otherwise display fractional number

鉴于此代码 (saved here as a gist):

import glob

num_files = len(glob.glob('*.jpg'))
if num_files > 0:
    print("Found {0} JPEG files".format(num_files))
    jpeg_files = glob.iglob('*.jpg')
    for count, filename in enumerate(jpeg_files, start=1):
        print("----\n")
        percent_complete = int((count * 100) / num_files)
        print("File: {0} ({1} of {2}; {3}%).".format(
               filename, count, num_files, percent_complete))
        if count == num_files:
            print("Working on {0}...".format(filename))
            # do stuff
            print("That was the last file.\n")
        else:
            print("Working on {0}...\n".format(filename))
            # do stuff
else:
    print("No .jpg files in current directory. Exiting.")
    pass

我有两个主要问题:

  1. 有没有更好的方法来构建第一部分,其中我 运行 glob 以获得文件数?只有当迭代器的计数不为零时,有没有什么方法可以 运行 迭代器?

  2. 因为我已经完成了 (count * 100),打印语句只会显示“5%”或“25”,而不会显示“25.5%”或“39.6%”。仅当百分比为整数时,如何才能让 percent_complete 显示为分数(即“32.5%”)? (即我不想显示“25.0”。)

谢谢,

只需删除 int() 并添加:

...
percent_complete = (count * 100) / num_files
if percent_complete % 1 == 0:
    percent_complete = int(percent_complete)
print...

通过做函数判断百分比是否为整数值解决,return如果不是则取小数点后两位:

import glob

def two_decimals(number: float):
    """Return passed number to two decimal places if not an integer,
    otherwise return number as an integer."""
    if (number - int(number) != 0):
        return "%.2f" % number
    else:
        return "%d" % number

num_files = len(glob.glob('*.jpg'))

if num_files > 0:
    
    print("Found {0} JPEG files".format(num_files))
    jpeg_files = glob.iglob('*.jpg')

    for count, filename in enumerate(jpeg_files, start=1):
        percent_complete = ((count * 100) / num_files)
        print("File: {0} ({1} of {2}; {3}%).".format(
               filename,
               count,
               num_files, 
               two_decimals(percent_complete)))
        if count == num_files:
            print("Working on {0}...".format(filename))
            # do stuff
            print("That was the last file.\n")
        else:
            print("Working on {0}...\n".format(filename))
            # do stuff
else:
    print("No .jpg files in current directory. Exiting.")
    pass