2015-10-22 1 views
1

У меня есть список путей к файлу unicode, в котором мне нужно заменить все умляуты английским диакритиком. Например, я бы ü с ue, ä с ae и так далее. Я определил словарь умляутов (ключей) и их диакритики (значения). Поэтому мне нужно сравнить каждую клавишу с каждым файловым путем и где ключ найден, замените его на значение. Кажется, это было бы просто, но я не могу заставить его работать. Кто-нибудь есть идеи? Любая обратная связь очень ценится!Python - переводчик немецких UMLauts на диакритические

код до сих пор:

# -*- 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 umlaut unicode representations (keys) and their replacements (values) 
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') 
for file in filePathsList: 
    for key, value in umlautDictionary.iteritems(): 
     if key in file: 
      file.replace(key, value) # does not work -- umlauts still in file path! 
      print file 
+0

заменить не изменяет в place, он возвращает измененную строку ... –

+2

Возможный дубликат [Почему не вызывает строковый метод Python ничего не делает, если вы не назначаете его вывод?] (http: // stackover flow.com/questions/9189172/why-doesnt-calling-a-python-string-method-do-anything-unless-you-assign-its-out) –

+2

Я не уверен, что такое правильный термин, но " диакритический "означает две точки, используемые для обозначения умлаутов, а не двухбуквенную орфографическую альтернативу. – chepner

ответ

4

Метод replace возвращает новую строку, она не изменяет исходную строку.

Так что вам нужно будет

file = file.replace(key, value) 

вместо просто file.replace(key, value).


Заметим также, что вы можете использовать the translate method сделать все замены сразу, вместо использования for-loop:

In [20]: umap = {ord(key):unicode(val) for key, val in umlautDictionary.items()} 

In [21]: umap 
Out[21]: {196: u'Ae', 214: u'Oe', 220: u'Ue', 228: u'ae', 246: u'oe', 252: u'ue'} 

In [22]: print(u'ÄÖ'.translate(umap)) 
AeOe 

Таким образом, вы можете использовать

umap = {ord(key):unicode(val) for key, val in umlautDictionary.items()} 
for filename in filePathsList: 
    filename = filename.translate(umap) 
    print(filename) 
+0

да! перевод работает отлично. вы для быстрой обратной связи !!! –

0

заменить строку

file.replace(key, value) 

с:

file = file.replace(key, value) 

Это потому, что строки являются неизменными в Python.

Это означает, что file.replace(key, value) возвращает копию file с замененными изделиями.

+1

славная копия пасты с вопроса о дублировании ^^ – inetphantom

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