我想要做的是遍历一个文件夹,检查文件名中是否包含任何西里尔字母,如果有,将这些文件重命名为其他名称。
我该如何做呢?
我该如何做呢?
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'属性。因此,您可以按照以下方式使用'encode'。
# -*- coding: utf-8 -*-
def check_value(value):
try:
value.encode('ascii')
except UnicodeEncodeError:
return False
else:
return True
Python 3
这个函数会检查传入的字符串中的每个字符,如果有斯拉夫文字,则返回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
ord()
呢? - Mark Ransomord()
。做了适当的更新。 - embert有一个与此相关的库: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)
listdir
的错。还要注意,如果您传递给listdir
一个Unicode,则它将返回Unicode文件名。但是,仍然需要您使用终端期望的编码对Unicode进行编码,并确保该Unicode可以使用该编解码器进行编码。这可能是Windows上的问题。 - unutbu
Unidecode
很有用。 - Mark Ransomord()
来缩短代码并提高速度。请参见更新的答案。 - embert