2014-07-30 2 views
4

Если символ зарегистрированного товарного знака не отображается в конце имени файла или папки, полоса не может использоваться. Почему не заменяет работу?Зарегистрированный товарный знак: Почему полоска remove ®, но замена не может найти ее? Как удалить символы из имен папок и файлов?

У меня есть старые файлы и папки с именем зарегистрированного товарного знака, который я хочу удалить.

Файлы не имеют расширения.

  • папку: "\ Data \ оригиналы \ Слово Finder®"
  • файл 1: "\ Data \ оригиналы \ Word Finder® DA"
  • файл 2: «\ Data \ оригиналы \ Word Finder® Тезаурус "

Для папки os.rename(p,p.strip('®')) работ. Однако замена os.rename(p,p.replace('®','')) не работает ни в папке, ни в файлах.

Заменить работы на поданные к нему нити, то есть: print 'Registered® Trademark®'.replace('®',''). Есть ли причина, по которой пути не следуют этой же логике?

примечание:

  • Я использую os.walk(), чтобы получить имена папок и файлов
+11

Худший .. имя файла .. когда-либо. –

+0

В файле 1 и файле 2 вы забыли разделитель путей после каталога 'Word Finder ® '? –

+5

Какую версию python вы используете? – skrrgwasme

ответ

1

Мой первоначальный вопрос «Зарегистрированный товарный знак: почему полоска remove ®, но замена не может найти его?» больше не применяется. Проблема не в том, что она не является полосой или заменой, а как os.rename() имеет дело с символами Unicode. Итак, я добавил к моему вопросу.

Уходя от того, что сказал Камерон, os.rename() похоже, что он не работает с символами Юникода. (пожалуйста, поправьте меня, если это не так - я об этом мало знаю). shutil.move() в конечном итоге дает тот же результат, что и os.rename().

Несмотря на предложение Скотта Лоусона использовать u '\ u00AE' вместо '®', я не мог заставить его работать.

В основном, используйте вместо этого shutil.move(old_name,new_name).

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import shutil 
import os 

# from this answer: https://stackoverflow.com/q/1033424/3889452 
def remove(value): 
    deletechars = '®' 
    for c in deletechars: 
     value = value.replace(c,'') 
    return value 

for root, folders, files in os.walk(r'C:\Users\myname\da\data\originals\Word_4_0'): 
    for f in files: 
     rename = remove(f) 
     shutil.move(os.path.join(root,f),os.path.join(root,rename)) 
    for folder in folders: 
     rename = remove(folder) 
     shutil.move(os.path.join(root,folder),os.path.join(root,rename))  

Это также работает для немедленного каталога (based off of this) и ловит больше символов, символов и т.д., которые не включены в string.printable и ® не должны появляться в коде Python.

import shutil 
import os 
import string 

directory_path = r'C:\Users\myname\da\data\originals\Word_4_0' 
for file_name in os.listdir(directory_path): 
    new_file_name = ''.join(c for c in file_name if c in string.printable) 
    shutil.move(os.path.join(directory_path,file_name),os.path.join(directory_path,new_file_name)) 
4

Я был не в состоянии воссоздать проблему, так что я не знаю, почему он не работает для вас. Вот обходной путь, хотя: вместо того, чтобы использовать зарегистрированный символ в исходном коде с методами строк, попытайтесь быть более явным с чем-то вроде этого:

import os 

for root, folders, files in os.walk(os.getcwd()): 
    for fi in files: 
     oldpath = os.path.join(root, fi) 
     newpath = os.path.join(root, fi.decode("utf-8").replace(u'\u00AE', '').encode("utf-8")) 
     os.rename(oldpath, newpath) 

Явное указание Юникода элемент кода, который вы ищете может помочь устранить количество мест, в которых ваш код может ошибиться. Интерпретатору больше не нужно беспокоиться о кодировании самого исходного кода.

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