2016-03-26 2 views
-2

Я довольно часто сталкивался с этой ошибкой при попытке записать азиатские символы в файл - я могу печатать символы просто отлично в IDLE (хотя и не в командной строке), но когда я пытаюсь записать их в файл, я получаю эту ошибку:UnicodeEncodeError при записи азиатских символов в файл

Traceback (most recent call last): 
    File "C:\Users\Tai\Desktop\Development\playlistcreator\main.py", line 21, in <module> 
    playlistcreator.addtoplaylist(list_of_paths,"C:\\Users\\Tai\\Desktop\\New Music\\testplaylist.m3u8") 
    File "C:\Users\Tai\Desktop\Development\playlistcreator\playlistcreator.py", line 74, in addtoplaylist 
    playlistFile.write(track + '\n') 
    File "C:\Users\Tai\AppData\Local\Programs\Python\Python35-32\lib\encodings\cp1252.py", line 19, in encode 
    return codecs.charmap_encode(input,self.errors,encoding_table)[0] 
UnicodeEncodeError: 'charmap' codec can't encode characters in position 56-57: character maps to <undefined> 

Я думать понять, что ошибка: в основном это не может сделать азиатские символы, поэтому он не может записать их в файл - но если я могу напечатать их в IDLE, почему бы им не написать их в файл? Есть ли способ обойти это?

(я не уверен, если код необходимо понять ошибку, но я выложу его в любом случае)

def addtoplaylist(paths, playlist_path): 
    # Open file (or create if it does not exist) 
    #change to given directory 
    try: 
     os.chdir(os.path.dirname(paths)) 
    except Exception as err: 
     print(err) 
    #open file - if it does not exist, create it 
    with open(os.path.basename(playlist_path), 'a+') as playlistFile: 
     for track in paths: 
      playlistFile.write(track + '\n') 
    playlistFile.close() 

ответ

0

Вы должны указать кодировку файла при его открытии, например:

with open(os.path.basename(playlist_path), 'a+', encoding='UTF-8') as playlistFile: 

В противном случае Python по умолчанию использует вашу консоль кодировки (ANSI) для файлов, в этом случае CP 1252, который является именем для Windows для расширенного латинского языка-1.

+0

Это работало как шарм, спасибо огромное! –

-1

Вы должны использовать кодировку, подходящую для персонажей.

playlistFile.write(track.encode(encoding=some_encoding) + '\n') 

Я думаю some_encode = 'utf-8' будет делать, но не совсем уверен.

Возможно, IDLE использует по-разному кодировку, и именно поэтому он работает там.

+0

Я попробовал и получил еще одну ошибку (хотя и другую): 'playlistFile.write (track.encode (encoding =" utf-8 ") + '\ n') TypeError: не может конкатцировать байты на str ' –

+0

Мне удалось исправить это, сделав строку байтовым литералом, но теперь у меня опять такая же ошибка с другим набором символов - мне, вероятно, нужно снова изменить кодировку, но спасибо, что установил меня на правильном пути! –

+0

@TaiM. вы используете Python 3, этот совет относится только к Python 2 –

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