[英]How to convert encoding of text file (which contains text of language other than English) from “UTF-16 LE” to “UTF-8” in Python?
我的几个文本文件在一个文件夹中包含印地语语言的文本。 但是这些文本文件采用UTF-16 LE
编码。 我想将编码更改为UTF-8
而不更改其中的文本。 我怎样才能做到这一点?
我写了两个python文件,但是它们都不能正常工作。 当我运行它们中的任何一个,以及更改编码时,它们都会清除文件内容。 这些是我的Python文件中的代码:
文件1:
import os
for root, dirs, files in os.walk("."):
for filename in files:
#print(filename[-4:])
if(filename[-3:] == "txt"):
f= open(filename,"w+")
x = f.read()
print(x)
f.close()
f1= open(filename, "w+", encoding="utf-8")
f1.write(x)
f1.close()
档案2:
import codecs
BLOCKSIZE = 1048576
with codecs.open("ee.txt", "r", "utf-16-le") as sourceFile:
with codecs.open("ee.txt", "w", "utf-8") as targetFile:
while True:
contents = sourceFile.read(BLOCKSIZE)
print(contents)
if not contents:
break
targetFile.write(contents)
您在读取内容时未指定文件位于utf-16 LE中,那样的话,试图同时读取和写入同一文件会有这种混乱,这将无法正常工作。
另外,除非您在服务器上运行此代码,在该服务器上可能通过向您发送过大的文本文件来进行攻击尝试,否则您不必担心文件大小,只需立即读取所有文件内容。 (为了使您有个主意,圣经是一本大书,大小约为3 MB(使用8位编码)-甚至小型VPS服务器也将为程序提供200 MB的可用内存-也就是说,您可以一次将一本大小超过30的圣经转换成一本书)。 典型的台式计算机将具有此内存量的几倍。
此外,相对较新的“ pathlib” Python库可以轻松终止所有文本文件,其Path.read_text
和Path.write_text
方法将打开文件,以正确的编码方式读取或写入内容,并以单个方式将其关闭表达。 由于使用此方法时,在写入文件时已经完成读取,因此我们可以通过两个调用简单地完成读取:
import pathlib
for filepath in pathlib.Path(".").glob("**/*.txt"):
data = filepath.read_text(encoding="utf-16 LE")
filepath.write_text(data, encoding="utf-8")
如果您希望安全起见,在文件转换过程中极不可能发生灾难性的计算机崩溃,则可以写入一个不同名称的文件,然后再进行删除/重命名-因此代码是像这样:
import pathlib
for filepath in pathlib.Path(".").glob("**/*.txt"):
data = filepath.read_text(encoding="utf-16 LE")
tmp_name = filepath.name + ".tmp"
filepath.with_name(tmp_name).write_text(data, encoding="utf-8")
filepath.unlink()
filepath.with_name(tmp_name).rename(filepath.name)
在向您解释错误之前,有两个有用的提示:
我认为您应该删除打印件。 它只会使您感到困惑,并且取决于操作系统和环境它将打印哪种编码。
尝试使用一个非常短的文件(字符很少),并检查两个文件的输入和输出是否为文本和字节。
现在的解决方案:
在第一个示例中:您应将第一个文件打开为read( r
)。
在第二个示例中:打开同一文件,第一步是读取文件,但是在读取文件之前,先打开文件进行写入,因此将其截断,将没有字符可读取。
使用ee.txt.tmp
文件进行写入,最后,如果没有错误,则可以移动tmp
文件,删除.tmp
前缀。
通常,切勿在同一文件上读写。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.