Python在读取中文文件,编码是ANSI格式的,希望能够将汉字一个一个输出。所以想转成UTF-8的。求解。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python在读取中文文件,编码是ANSI格式的,希望能够将汉字一个一个输出。所以想转成UTF-8的。求解。相关的知识,希望对你有一定的参考价值。

Traceback (most recent call last): File "<pyshell#7>", line 1, in <module>
'我'.encode('UTF-8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)

如何破
'我'.encode('UTF-8') 。。?

一般来说读出来的字符串,所以要"我".decode("ascii").encode("utf-8")
如果还不行,就结合下面这段代码试试,编码可以换换,反正我最近就是这样解决的
import sys
reload(sys)
sys.setdefaultencoding('utf8')
参考技术A # _*_ coding: utf-8 _*_
path = 'X:\\XXX\\XXX.txt'
fileobj = open(path, 'r')

try:
lists = fileobj.readlines() #按行读取,存入字符串到list中。
finally:
fileobj.close()
for item in lists:
print item #这个时候打印出来的就是中文了。整个过程没有用到decode() 和encode()

如何读取具有 ANSI 编码和非英文字母的文本文件?

【中文标题】如何读取具有 ANSI 编码和非英文字母的文本文件?【英文标题】:How to read text files with ANSI encoding and non-English letters? 【发布时间】:2012-08-21 06:01:27 【问题描述】:

我有一个包含非英语字符的文件,并使用非英语代码页以 ANSI 编码保存。如何在 C# 中读取此文件并正确查看文件内容?

不工作

StreamReader sr=new StreamReader(@"C:\APPLICATIONS.xml",Encoding.ASCII);
var ags = sr.ReadToEnd();
sr=new StreamReader(@"C:\APPLICATIONS.xml",Encoding.UTF8);
ags = sr.ReadToEnd();
sr=new StreamReader(@"C:\APPLICATIONS.xml",Encoding.Unicode);
ags = sr.ReadToEnd();

工作但我需要提前知道代码页是什么,这是不可能的。

sr=new StreamReader(@"C:\APPLICATIONS.xml",Encoding.GetEncoding(1252));
ags = sr.ReadToEnd();

【问题讨论】:

【参考方案1】:
 var text = File.ReadAllText(file, Encoding.GetEncoding(codePage));

代码页列表:https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers?redirectedfrom=MSDN

【讨论】:

我需要知道代码页。我事先不知道。 @MichaelT 有一些开源库可以猜测编码,但这不是一个简单的过程。 我看到旧的 MS 记事本处理这个文件没有问题,并认为我遗漏了什么。 @MichaelT How can I detect the encoding/codepage of a text file 记住 joelonsoftware.com/articles/Unicode.html - 每个软件开发人员绝对、绝对必须了解 Unicode 和字符集(没有任何借口!),作者 Joel Spolsky【参考方案2】:

当您的文本文件使用高 ANSI 编码时,您会得到问号-菱形字符——这意味着它使用 127 到 255 之间的字符。这些字符设置了第八位(即最重要的位)。当 ASP.NET 读取文本文件时,它采用 UTF-8 编码,并且最高有效位具有特殊含义。

您必须强制 ASP.NET 将文本文件解释为高 ANSI 编码,告诉它代码页是 1252:

String textFilePhysicalPath = System.Web.HttpContext.Current.Server.MapPath("~/textfiles/MyInputFile.txt");
String contents = File.ReadAllText(textFilePhysicalPath, System.Text.Encoding.GetEncoding(1252));
lblContents.Text = contents.Replace("\n", "<br />");  // change linebreaks to HTML

【讨论】:

恕我直言,应该是公认的答案。此外,使用 .NET core 2.x 或 .NET Standard,您会遇到新问题。代码页需要在之前注册..见***.com/questions/37870084/… 请注意,.NET Core 仅支持 ASCII、ISO-8859-1 和 Unicode 编码。因此,当您尝试使用编码 1252(ANSI 拉丁语 1;西欧 Windows)时会出现错误。对我有用的是编码 65000(utf-7 Unicode)。【参考方案3】:

如果我没记错的话,无论 XML 编码如何,XmlDocument.Load(string) 方法总是假定为 UTF-8。 您必须创建一个具有正确编码的 StreamReader 并将其用作参数。

xmlDoc.Load(new StreamReader(
                     File.Open("file.xml"), 
                     Encoding.GetEncoding("iso-8859-15"))); 

我刚刚偶然发现了来自 Microsoft 的 KB308061。有一段很有意思: 在 XML 文档的 XML 声明部分中指定编码声明。例如,以下声明表明文档是 UTF-16 Unicode 编码格式:

<?xml version="1.0" encoding="UTF-16"?>

请注意,此声明仅指定 XML 文档的编码格式,并不修改或控制数据的实际编码格式。

链接来源:

XmlDocument.Load() method fails to decode € (euro)

【讨论】:

为什么不File.ReadAllText -@MichaelT 你能把你的结果截屏吗? -@MichaelT :试试我的新答案 如果您的 XML 文件中的 &lt;?xml?&gt; 序言说 UTF-8,并且它不是正确的 UTF-8 流,那么您所得到的不是格式正确的,因此不是 XML。确实,您需要修复产生虚假 XML 文件的任何内容。【参考方案4】:

以我的 c++/clr (WinForms) 为例,这种方法取得了成功:

String^ str2 = File::ReadAllText("MyText_cyrillic.txt",System::Text::Encoding::GetEncoding(1251)); 
textBox1->Text = str2;   

【讨论】:

【参考方案5】:
using (StreamWriter writer = new StreamWriter(File.Open(@"E:\Sample.txt", FileMode.Append), Encoding.GetEncoding(1250)))  ////File.Create(path)
        
            writer.Write("Sample Text");
        

【讨论】:

对代码的小解释有助于更多。请解释这段代码的作用。 我必须支持@OlcayErtaş 所说的话,尤其是考虑到对此还有其他几个高质量的答案。

以上是关于Python在读取中文文件,编码是ANSI格式的,希望能够将汉字一个一个输出。所以想转成UTF-8的。求解。的主要内容,如果未能解决你的问题,请参考以下文章

Qt读取ANSI格式文件——利用QTextCodec将其他编码格式的QByteArray转换为Unicode格式,或者从文件中读出后直接做转换

用java的流复制文件,并改变编码格式,由ansi改为utf-8格式

如何判断一个文件的编码格式,UNICODE,BIG5,毕业设计

UTF-8,GBK,ANSI编码的区别

如何读取具有 ANSI 编码和非英文字母的文本文件?

在linux系统下使用lazarus,ansi和utf8编码格式怎么互相转换? 我需要做一个可以读取windows系统发送来的t