重命名西里尔文件名

时间:2014-12-29 21:33:12

标签: python file-rename cyrillic

我想到的是迭代文件夹以检查文件名是否包含任何西里尔字符,如果有,则将这些文件重命名为其他文件。

我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

Python 2:

# -*- coding: utf-8 -*-
def check_value(value):
    try:
        value.decode('ascii')
    except UnicodeDecodeError:
        return False
    else:
        return True

Python 3:

Python 3' str'对象没有属性' decode'。因此,您可以按如下方式使用编码。

# -*- coding: utf-8 -*-
def check_value(value):
    try:
        value.encode('ascii')
    except UnicodeEncodeError:
        return False
    else:
        return True

然后您可以收集文件名,并通过check_value函数传递它们。

答案 1 :(得分:3)

Python 3
这个检查传递的字符串的每个字符,无论它是否在Cyrillic块中,如果字符串中包含西里尔字符,则返回True。 Python3中的字符串默认为unicode。该函数将每个字符编码为 utf-8 ,并检查这是否产生与包含西里尔字符的表块匹配的两个字节。

def isCyrillic(filename):
    for char in filename:            
        char_utf8 = char.encode('utf-8')      # encode to utf-8 

        if len(char_utf8) == 2 \              # check if we have 2 bytes and if the
            and 0xd0 <= char_utf8[0] <= 0xd3\ # first and second byte point to
            and 0x80 <= char_utf8[1] <= 0xbf: # Cyrillic block (unicode U+0400-U+04FF)
            return True

    return False

使用评论

中建议的ord()功能相同
def isCyrillicOrd(filename):
    for char in filename:                  
        if 0x0400 <= ord(char) <= 0x04FF:    # directly checking unicode code point
            return True

    return False

测试目录

cycont
   |---- asciifile.txt
   |---- кириллфайл.txt
   |---- украї́нська.txt
   |---- संस्कृत.txt

<强>测试

import os
for (dirpath, dirnames, filenames) in os.walk('G:/cycont'):
    for filename in filenames:
        print(filename, isCyrillic(filename), isCyrillicOrd(filename))

<强>输出

asciifile.txt False False
кириллфайл.txt True True
украї́нська.txt True True
संस्कृत.txt False False

答案 2 :(得分:1)

有一个为此编写的库:Python的transliterate lib

所以,首先你需要获取你的文件名。为此,请使用os.listdir():

from os import listdir
from os.path import isfile, join
files = [ f for f in listdir(dir) if isfile(join(dir,f)) ]

现在,您可以查看文件中的每个文件,根据需要替换任何字符:

import transliterate
newName = translit(filename, 'ru', reversed=True)

然后只需使用os.rename重命名文件:

os.rename(filename, newName)