Что я имею в виду, это итерирование через папку, чтобы проверить, содержат ли имена файлов какие-либо кириллические символы, если они это делают, переименуйте эти файлы в другое.Переименование имен кириллиц
Как я могу это сделать?
Что я имею в виду, это итерирование через папку, чтобы проверить, содержат ли имена файлов какие-либо кириллические символы, если они это делают, переименуйте эти файлы в другое.Переименование имен кириллиц
Как я могу это сделать?
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
каталог Test
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
Зачем переходить к переходу на UTF-8, когда вы можете проверить 'ord()' персонажа напрямую? –
@markransom Легко ответить: я не знал о 'ord()'. Сделал соответствующее обновление. – embert
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 не имеет атрибут 'расшифровывает'. Таким образом, вы можете использовать кодировку следующим образом.
# -*- coding: utf-8 -*-
def check_value(value):
try:
value.encode('ascii')
except UnicodeEncodeError:
return False
else:
return True
Затем вы можете собирать имена файлов и передавать их через функцию check_value.
Мне было трудно определить разницу между Python 2 и Python 3, чтобы помочь. – Thomas
Я обновил его до «почему», есть разница. Благодарю. – CodeLikeBeaker
Не вернет ли это False для тех некириллических символов, которые также не являются ascii (например, греческими)? –
У этой библиотеки есть библиотека, написанная для этого: 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() заключается в том, что вместо того, чтобы возвращать имена файлов в кириллице, они возвращают вопросительные знаки. – astraTiCon
@MarioGeuenich: вопросительные знаки вызваны несоответствием между кодировкой байтов в имени файла и кодировкой вашего терминала. Следует отметить ошибку 'listdir'. Также не следует, что если вы передадите 'listdir' unicode, то он вернет имена файлов Unicode. Тем не менее, на вас все еще лежит задача кодировать юникод с кодировкой, которую ожидает ваш терминал, и убедиться, что код unicode * может быть закодирован с этим кодеком. Это может быть проблема в Windows (http://bugs.python.org/issue1602). – unutbu
Какую версию питона? 2.x и 3k - очень разные операции с w/r/t string. –
Возможно, вы найдете ['Unidecode'] (https://pypi.python.org/pypi/Unidecode). –
[транслитерировать] (https://pypi.python.org/pypi/transliterate) также может оказаться полезным. – unutbu