[英]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.