请教一个python的for loop中断问题?

查看:105
本文介绍了请教一个python的for loop中断问题?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

本人 py 新手,最近想写个脚本,正则匹配影片的"号码"及新建相应的规范标题文件夹如:"ABC-000"这样的(资源比较乱...),下面是其中一部分渣代码,

key_sym = re.compile(r"[a-zA-Z]{2,5}[\_\-]{1,2}\d{2,3}")  #中间有符号
key_mid = re.compile(r"[a-zA-Z]{2,5}00\d{2,3}")    #中间是 00
key_non = re.compile(r"[a-zA-Z]{2,5}\d{2,3}")       #中间没有东西
key_low = re.compile(r"^[a-z]{2,5}")     #小写开头
key_int = re.compile(r"\d{2,3}$")          #数字结尾
key_upp = re.compile(r"^[A-Z]{2,5}")

def get_num(self):
    if key_sym.findall(self):
        flname = key_sym.findall(self)[0]
        if re.match(key_low,flname):
            flname = re.findall(key_low,flname)[0].upper() + '-' + re.findall(key_int,flname)[0]
        elif re.match(key_upp,flname):
            flname = re.findall(key_upp,flname)[0] + '-' + re.findall(key_int,flname)[0]
        return flname
    elif key_mid.findall(self):
        flname = re.sub(r"00",'-',key_mid.findall(self)[0])
        if re.match(key_low,flname):
            flname = re.findall(key_low,flname)[0].upper() + '-' + re.findall(key_int,flname)[0]
        return flname
    elif key_non.findall(self):
        str1 = key_non.findall(self)[0]
        flname = re.findall(r"[a-zA-Z]{2,5}",str1)[0] + '-' + re.findall(r"[0-9]{2,3}",str1)[0]
        if re.match(key_low,flname):
            flname = re.findall(key_low,flname)[0].upper() + '-' + re.findall(key_int,flname)[0]
        return flname
    else:
        with open('C:/python/Not_finish.txt','a') as f:
            f.write(self + '\n')
            f.close()
        print(self + '  Not Format')

思路是遇到符合的影片就返回标准的名称比如:"ABC-000"这样的,不符合正则的就写入到一个 txt 文件中作为标记。

问题是每次此函数遇到不符合正则的的确会写入 txt ,但是 for loop 也因此中断了。。

test = r'N:\HBAD '
print(os.listdir(test))
try:
    for a in os.listdir(test):
        if not os.path.exists(os.path.join(test,get_num(a))):
            os.mkdir(os.path.join(test,get_num(a))) #问题是 get_num()一遇到不符合正则的文件就会写入 txt ,然后中断递归
except Exception as  e:
    print(str(e))

请问应该如何修改才能达到将不符合的文件写入 txt 后, for loop 仍能保持递归?尝试过在打开文件那里 return 不符合的文件名,的确 for loop 不会中断但相应的多新建了一个没用的文件夹。。

第一次发帖不懂,代码也很渣,还望各位多指点

解决方案

问题出在这个代码块:

test = r'N:\HBAD '
print(os.listdir(test))
try:
    for a in os.listdir(test):
        if not os.path.exists(os.path.join(test,get_num(a))):
            os.mkdir(os.path.join(test,get_num(a))) #问题是 get_num()一遇到不符合正则的文件就会写入 txt ,然后中断递归
except Exception as  e:
    print(str(e))

其中不符合正则是,会写入文件,但是:

else:
        with open('C:/python/Not_finish.txt','a') as f:
            f.write(self + '\n')
            f.close()
        print(self + '  Not Format')

此代码块没有返回值,所以导致下面一句抛出异常:

os.mkdir(os.path.join(test,get_num(a))) 
# 因为get_num执行到最后没匹配,并没有返回值,则默认会返回None
# 所以变成执行-> os.mkdir(os.path.join(test,None)) 
# 抛出异常
"""
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/posixpath.py", line 75, in join
    if b.startswith('/'):
AttributeError: 'NoneType' object has no attribute 'startswith'
"""

然后被外围的try,except捕捉到,于是退出for循环。

另外因为你是初学者,给你提几点建议:

  • for循环是遍历不是递归

  • get_num函数,每次不匹配都要重新打开文件,并添加,效率低下,可以传入文件描述符f到此函数中处理即可

  • with open()语句,最后的f.close是多余的,因为with上下文已经帮你做好了这一切

这篇关于请教一个python的for loop中断问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆