如何使用python在文件中写'Ñ'

时间:2015-08-29 23:01:22

标签: python python-2.7

我知道可以用这种方式声明编码:

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

但是当我尝试在文件中写'ñ'时,会写'Ã'而不是。

我也尝试过这种方式(就像在文档中写here

import codecs

f = codecs.open('output', encoding='utf-8')
f.write("ñÑ")

但它提出了:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

2 个答案:

答案 0 :(得分:6)

您正在使用codecs.open(),生成需要 unicode个对象的文件对象。但是,您传入一个字节字符串,因此Python必须首先使用默认的ASCII编解码器解码为unicode。这就是为什么你得到一个解码错误,其中ASCII编解码器无法解码你的UTF-8字节。

解码字符串,使用unicode字符串文字,或使用open()代替codecs.open()

其中每一项都有效:

# -*- coding: utf-8 -*-
import codecs
with codecs.open('output', encoding='utf-8') as f:
    f.write(u"ñÑ")

# -*- coding: utf-8 -*-
import codecs
with codecs.open('output', encoding='utf-8') as f:
    f.write("ñÑ".decode('utf8'))

# -*- coding: utf-8 -*-
with open('output') as f:
    f.write("ñÑ")

codecs.open()确实采用了编解码器,但它告诉文件对象如何将unicode个对象编码为字节。

答案 1 :(得分:1)

试试#!/usr/bin/env python3 # coding: utf-8 import tkinter as tk from tkinter import ttk class SpiderGUI(): def __init__(self, master): self.master = master self.frame = ttk.Frame(self.master, padding=(10, 10, 10, 10)) self.frame.pack(fill="both", expand="True") self.paned_window = ttk.Panedwindow(self.frame, orient="horizontal") self.paned_window.pack(fill="both", expand="True") self.frame_settings = ttk.Frame(self.paned_window, width=75, height=300, relief="sunken") self.paned_window.add(self.frame_settings) self.frame_output = ttk.Frame(self.paned_window, width=950, height=300, relief="sunken") self.paned_window.add(self.frame_output, weight="4") self.frame_logging = ttk.Frame(self.paned_window, width=175, height=500, relief="sunken") self.paned_window.add(self.frame_logging) self.console_notebook = ttk.Notebook(self.frame_output) self.console_notebook.pack() self.frame_tab_console = ttk.Frame(self.console_notebook) self.console_notebook.add(self.frame_tab_console, text="Console", padding=(10)) self.frame_tab_database = ttk.Frame(self.console_notebook) self.console_notebook.add(self.frame_tab_database, text="MongoDB") def main(): root = tk.Tk() app = SpiderGUI(root) # root.geometry(newGeometry="1200x800+100+100") root.title('name') root.resizable(width=True, height=False) # root.maxsize(width=1280, height=1024) # root.minsize(width=640, height=480) root.mainloop() if __name__ == '__main__': main() 字符串前面的u使它成为另一种字符串......