Как преобразовать кодировку текстового файла (который содержит текст на языке, отличном от английского) из "UTF-16 LE" в "UTF-8" в Python? - PullRequest
0 голосов
/ 29 мая 2019

У меня есть несколько текстовых файлов, которые содержат текст на языке хинди в папке.Но эти текстовые файлы в кодировке 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)

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Вы не указываете, что файлы находятся в utf-16 LE при чтении содержимого - вот и возникает путаница при попытке чтения и записи в один и тот же файл одновременно, что не сработает.

Кроме того, если вы не запускаете этот код на сервере, где можно предпринять попытку атаки, отправив вам чрезмерно большой текстовый файл, вам не следует беспокоиться о размере файла, а просто прочитайте все содержимое файла сразу. (Чтобы у вас была идея, Библия, которая является большой книгой, имеет размер порядка 3 МБ (с 8-битной кодировкой) - и даже небольшие VPS-серверы будут иметь порядка 200 МБ памяти, доступной для вашей программы - то есть вы можете конвертировать книгу размером более 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)
0 голосов
/ 29 мая 2019

Прежде чем объяснить вам, в чем дело, два полезных совета:

Я думаю, вам следует удалить отпечаток.Это просто сбивает вас с толку, и зависит от операционной системы и среды, какую кодировку он будет печатать.

Попробуйте использовать очень короткий файл (несколько символов) и проверьте ввод и вывод обоих файлов в виде текста ив байтах.

Теперь решение:

В первом примере: вы должны открыть первый файл как прочитанный (r).

Во втором примере: вы открываете тот же файл, первый шаг для чтения, но перед тем, как читать файл, вы открываете его для записи, поэтому вы обрезаете файл, и у вас не останется символов для чтения.

Используйте для записи файл ee.txt.tmp, а наВ конце, если ошибки нет, вы можете переместить файл tmp, удалив префикс .tmp.

В общем случае: никогда не читайте и не пишите один и тот же файл.

...