2013-04-21 3 views
1

Я пытаюсь написать программу, которая будет принимать имена файлов и переименовывать их, изменяя порядок слов. Он отлично работает для большинства файлов, но у меня есть несколько файлов с японскими символами в имени файла, для которого программа не работает. Я думаю, это потому, что он преобразует символы в вопросительные знаки (я проверил это с помощью печати), а затем не могу найти файл, потому что в нем есть японские символы, а не вопросительные знаки. Как я могу обойти это?Python преобразование японского ввода в вопросительные знаки

Редактировать: Да, я использую Windows.

Воспитание моего кода опубликовано ниже (я довольно новичок в этом, поэтому он может быть очень неэффективным и трудно читаемым).

import os 

def Filenames(filelist): 
    filenames = [] 
    for name in filelist: 
     name = name.split(".") #Take off file extension 
     filenames.append(name) 
    return filenames 

def ReformatName(directory): 
    filelist = [] 
    name = []  

    filelist = os.listdir(directory) 
    filenames = Filenames(filelist) 

    for doc in filenames: #Docs are in form "Date Name Subject DocName", want to turn into "Subject DocName Date" 
     doc1 = doc.split(" ") 
     date = doc1[0] 
     subject = doc1[2] 
     docname = doc1[3] 

     newdoc = "%s %s %s.docx" %(subject, docname, date) 
     doc = ".".join(doc) 
     os.rename(os.path.normpath(directory + os.sep + doc), os.path.normpath(directory + os.sep + newdoc)) 
+0

Вы используете Windows? – Blender

+0

Пожалуйста, покажите, какой код вы написали. – alecxe

+0

Похоже, ваша программа небезопасна в юникоде, что обычно плохо. Может быть, если вы разместите какой-нибудь код, мы сможем помочь вам работать с не-ASCII-входом? – ubik

ответ

1

Я нашел довольно сложное решение проблем с консолью Windows:

# -*- coding: utf-8 -*- 
import sys 
import codecs 

def setup_console(sys_enc="utf-8"): 
    reload(sys) 
    # Calling a system library function if we're using win32 
    if sys.platform.startswith("win"): 
     import ctypes 
     enc = "cp%d" % ctypes.windll.kernel32.GetOEMCP() #TODO: check on win64/python64 
    else: 
     # It seems like for Linux everything already exists 
     enc = (sys.stdout.encoding if sys.stdout.isatty() else 
        sys.stderr.encoding if sys.stderr.isatty() else 
         sys.getfilesystemencoding() or sys_enc) 

    # Encoding for sys 
    sys.setdefaultencoding(sys_enc) 

    # Redefining standard output streams if they aren't redirected 
    if sys.stdout.isatty() and sys.stdout.encoding != enc: 
     sys.stdout = codecs.getwriter(enc)(sys.stdout, 'replace') 

    if sys.stderr.isatty() and sys.stderr.encoding != enc: 
     sys.stderr = codecs.getwriter(enc)(sys.stderr, 'replace') 

Источник: http://habrahabr.ru/post/117236/ (доступен только на русском языке)

+0

Спасибо за ваш ответ. Что мне делать с этим? Опубликовать его в начале моего кода? – gadmaget

+0

@ user2293073 Да, вы должны вызвать функцию 'setup_console' в начале вашей программы. – Alexey

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