2015-10-21 2 views
0

Я пытаюсь работать с наборами и методом пересечения, чтобы найти, какие элементы в списке файлов в Юникоде имеют определенные символы. Цель состоит в том, чтобы заменить эти символы другими символами, поэтому я сделал словарь ключей и значений, где ключ - это то, что будет заменено, а значения - это то, что будет заменено. Однако, когда я пытаюсь создать набор пересечений путей с символами, подлежащими замене, это приводит к пусту. Что я делаю не так? У меня есть работа с циклами, но я хотел бы сделать это максимально эффективным. Обратная связь приветствуется!Python 2.7 - Перекрестный юникодный словарь с Unicode-списком

Код:

# -*- coding: utf-8 -*- 

import os 

def GetFilepaths(directory): 
    """ 
    This function will generate all file names a directory tree using os.walk. 
    It returns a list of file paths. 
    """ 
    file_paths = [] 
    for root, directories, files in os.walk(directory): 
     for filename in files: 
      filepath = os.path.join(root, filename) 
      file_paths.append(filepath) 
    return file_paths 

# dictionary of umlauts (key) and their replacements (value) 
umlautDictionary = {u'Ä': 'Ae', 
        u'Ö': 'Oe', 
        u'Ü': 'Ue', 
        u'ä': 'ae', 
        u'ö': 'oe', 
        u'ü': 'ue' 
        } 

# get file paths in root directory and subfolders 
filePathsList = GetFilepaths(u'C:\\Scripts\\Replace Characters\\Umlauts') 
print set(filePathsList).intersection(umlautDictionary) 
+0

Что возвращает 'filePathsList'? – Vaulstein

+0

список полных путей к файлу –

+0

вы пробовали 'set (filePathsList.intersection (umlautDictionary))'? – Onilol

ответ

1

filePathsList список строк:

[u'file1Ä.txt', u'file2Ä.txt', ...] 

umlautDictionary используется как последовательность ключей:

{u'Ä':..., ...} 

Пересечение пусто, так как string u'Ä 'не отображается в вашем списке строк. Вы сравниваете u'Ä 'с u'file1Ä.txt', которые не равны. Установить пересечение не будет проверять подстроки.

+0

Он не может проверить ключ/значение? – Onilol

+0

«Установить пересечение не будет проверять подстроки». Это объясняет проблему, спасибо. –

1

Поскольку вы хотите заменить символы Юникода в именах файлов с символами, которые вы хотите, я хотел бы предложить следующий подход:

umlautDictionary = {u'\xc4': u'Ae'} 
filePathsList = [u'file1Ä.txt', u'file2Ä.txt'] 

words = [w.replace(key, value) for key, value in umlautDictionary.iteritems() for w in filePathsList] 

Выход:

[u'file1Ae.txt', u'file2Ae.txt'] 

Вы должны были бы хранить Юникод символы в форме u'\xc4' для u'Ä' и так далее.

+0

хорошее предложение, но оно не совсем работает. уммауты действительно заменены, но в списке результатов содержатся как пути с заменой умляутов, так и пути без замены умляутов. –

+0

также, ваш пример кода дает мне следующий вывод: [u'file1 \ xc3 \ x84.txt ', u'file2 \ xc3 \ x84.txt'] –

+0

Отлично работает для меня, добавили ли вы другие умлауты в ваш словарь, как в u '\ xc3' (u'Ã ') для этого. Ваш словарь должен выглядеть так: umlautDictionary = {u '\ xc4': u'Ae ', u' \ xc3 ':' Замена для Ã здесь ', u' \ x84 ':' Замена для __ здесь '} В основном каждое ** представление не-ascii символа ** как ** key ** и его ** соответствующая замена ** как ** значение **. – Vaulstein

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