簡體   English   中英

如何在Python中將文本文件(包含非英語語言的文本)的編碼從“ UTF-16 LE”轉換為“ UTF-8”?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM