V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
tbag781623489
V2EX  ›  Python

请教一个比较低级的问题?

  •  
  •   tbag781623489 · 2016-12-02 13:37:28 +08:00 · 1806 次点击
    这是一个创建于 2919 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人 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 不会中断但相应的多新建了一个没用的文件夹。。

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

    zmrenwu
        1
    zmrenwu  
       2016-12-02 17:22:02 +08:00
    把 for loop 从 try 代码块中移出, try 只包含 os.mkdir(os.path.join(test,get_num(a))) 这一句
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2838 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 14:23 · PVG 22:23 · LAX 06:23 · JFK 09:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.