Python使用os.path.getsize筛选大体积PDF文件返回空列表问题
问题成因
- 核心错误是混淆了两类运算符:你用了做二进制位运算的
&(按位与)来组合布尔判断条件,但Python中组合多个“同时满足”的判断条件应该用逻辑运算符and。
再加运算符优先级的影响:&的优先级比比较运算符>高,所以你写的判断条件实际执行顺序和预想的完全不一样,等价于先把isfile()返回的布尔值、endswith()返回的布尔值、getsize()返回的文件大小值三个数做按位与运算,再把运算结果和18000比较大小。
布尔值在参与位运算时True等价于整数1、False等价于整数0,三个数按位与的结果只能是0或者1,永远不可能大于18000,因此所有文件都会被判定为不符合条件,最终返回空列表。 - 额外代码隐患:你调用
getsize()时直接用字符串相加拼接路径folder_location+f,如果目录路径末尾没有携带系统对应的路径分隔符(Windows下是\、类Unix系统下是/),会直接拼接出无效路径触发报错,之前能正常打印文件大小只是刚好传入的folder_location末尾带了分隔符,属于巧合,应该统一用已经导入的join()函数做安全的路径拼接。
修正方案
将条件判断里的&全部替换为and,同时修正getsize()的路径拼接逻辑,修正后的代码如下:
pdf_files = [ f for f in listdir(folder_location) if isfile(join(folder_location, f)) and f.lower().endswith(".pdf") and getsize(join(folder_location, f)) > 18000 ]
补充说明:如果你说的18Ko是严格的18KiB,对应的字节数是
18 * 1024 = 18432,可以把判断阈值从18000改成18432,筛选精度会更准确。
内容的提问来源于stack exchange,提问作者fransua
相关产品推荐
相关产品推荐

