如何用印地语将数据写入文件?

时间:2019-04-01 16:35:37

标签: python tkinter file-handling filedialog

我正在尝试使用python tkinter在非罗马脚本中将数据写入文件。我想将数据写入遵循梵文脚本的印地语语言文件中。虽然,当我用英语写一些数据时,它工作得很好,而用印地语写文件则抛出了一些错误。我该如何解决这个问题?

我尝试在filedialog命令中添加(encoding ='utf-8')。这样做会产生以下错误:

_tkinter.TclError:错误的选项“ -encoding”:必须为-confirmoverwrite,-defaultextension,-filetypes,-initialdir,-initialfile,-parent,-title或-typevariable

单击按钮时立即显示此错误。也许(encoding ='utf-8')不是filedialog的属性。 以下是代码的相关部分:

def save_file_hindi(event=""):
    data = filedialog.asksaveasfile(mode="w", defaultextension=".html")
    if data is None:
        return

    data.write("एक" + "<br>\n"+ "दो" + "<br>\n")
    data.close()

预期结果: 在保存的HTML文件中,它应显示:

एक

दो

实际结果: UnicodeEncodeError:“ charmap”编解码器无法对位置19-26中的字符进行编码:字符映射为未定义

3 个答案:

答案 0 :(得分:0)

尝试过此代码,在Windows 10下与Python 3.6.5配合使用时效果很好:

text = """<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head><body>
<p>एक  दो</p>
</body></html>"""

with open('test.html', 'w', encoding='utf8') as file:
    file.write(text)

您的环境如何?您是否尝试过在不同的编辑器和/或浏览器中打开文件?

答案 1 :(得分:0)

根据File Dialogs documentation for asksaveasfilename,没有可用的加密选项。但是您可以在写入模式下打开文件,将编码指定为'utf-8',然后再写入。

import tkinter as tk
from tkinter import filedialog

def Test():        
    root = tk.Tk()

    myFile = filedialog.asksaveasfilename(defaultextension='.html')

    if not myFile:
        return        

    with open(myFile, 'w', encoding='utf-8') as f:
        f.write("एक" + "<br>\n"+ "दो" + "<br>\n")   

    root.mainloop()


Test()

答案 2 :(得分:0)

我找到了一个非常可行的解决方案,可以解决我先前遇到的问题。因此,我正在回答我自己的问题,因为对于遇到类似于我的错误的任何人来说,它可能会派上用场。该解决方案应能以非罗马文字(印地语,乌尔都语,中文,俄语,阿拉伯语等)的任何语言写入文件。我正在使用的编程环境是python 3.6。

该代码的唯一更正是-

  1. 将mode ='w'更改为mode ='wb',以便以字节为单位读取要写入文件的数据,因为对于任何形式的编码,解释器必须以字节为单位扫描数据。
  2. 在(.write)命令行中,以.encode('utf-8')形式添加编码。正如我在问题中提到的那样,encode ='utf-8'不是(filedialog.asksaveasfile)的“属性”。但是,它实际上是一个“方法”,并且仅以这种方式制定。 因此,新的更正后的代码是-

     def save_file_hindi(event=""):
     data = filedialog.asksaveasfile(mode="wb", defaultextension=".html")
     if data is None:
         return
    
     data.write(("एक" + "<br>\n"+ "दो" + "<br>\n").encode('utf-8'))
     data.close()