2014-12-29 2 views
4

Что я имею в виду, это итерирование через папку, чтобы проверить, содержат ли имена файлов какие-либо кириллические символы, если они это делают, переименуйте эти файлы в другое.Переименование имен кириллиц

Как я могу это сделать?

+0

Какую версию питона? 2.x и 3k - очень разные операции с w/r/t string. –

+0

Возможно, вы найдете ['Unidecode'] (https://pypi.python.org/pypi/Unidecode). –

+0

[транслитерировать] (https://pypi.python.org/pypi/transliterate) также может оказаться полезным. – unutbu

ответ

3

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 
+0

Зачем переходить к переходу на UTF-8, когда вы можете проверить 'ord()' персонажа напрямую? –

+0

@markransom Легко ответить: я не знал о 'ord()'. Сделал соответствующее обновление. – embert

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 не имеет атрибут 'расшифровывает'. Таким образом, вы можете использовать кодировку следующим образом.

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

Затем вы можете собирать имена файлов и передавать их через функцию check_value.

+0

Мне было трудно определить разницу между Python 2 и Python 3, чтобы помочь. – Thomas

+1

Я обновил его до «почему», есть разница. Благодарю. – CodeLikeBeaker

+0

Не вернет ли это False для тех некириллических символов, которые также не являются ascii (например, греческими)? –

1

У этой библиотеки есть библиотека, написанная для этого: 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) 
+0

Проблема с listdir() заключается в том, что вместо того, чтобы возвращать имена файлов в кириллице, они возвращают вопросительные знаки. – astraTiCon

+0

@MarioGeuenich: вопросительные знаки вызваны несоответствием между кодировкой байтов в имени файла и кодировкой вашего терминала. Следует отметить ошибку 'listdir'. Также не следует, что если вы передадите 'listdir' unicode, то он вернет имена файлов Unicode. Тем не менее, на вас все еще лежит задача кодировать юникод с кодировкой, которую ожидает ваш терминал, и убедиться, что код unicode * может быть закодирован с этим кодеком. Это может быть проблема в Windows (http://bugs.python.org/issue1602). – unutbu

Смежные вопросы