Python: как я могу прочитать файл в кодировке x и сохранить его как utf-8 - PullRequest
0 голосов
/ 03 января 2019

У меня есть огромный набор данных (около 8,5 млн записей) в файле ".csv" (он использует каналы вместо запятых), я понятия не имел, какова его кодировка, так как я живу в Мексике и имею акценты (éé...) Я предполагаю, что он либо латинский, либо iso-8859-1.

Когда я пытаюсь импортировать файл в DataFrame, используя pandas

bmc=pd.read_csv('file.csv', sep='|', 
            error_bad_lines=False, encoding='iso-8859-1')

Он ничего не читает:

    ÿþF     Unnamed: 1  Unnamed: 2  Unnamed: 3  Unnamed: 4
0   NaN     NaN         NaN         NaN         NaN
1   NaN     NaN         NaN         NaN         NaN
2   NaN     NaN         NaN         NaN         NaN

Если я не помещаю iso-8859-1 или латиницу, я получаю ошибку:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

Итак, чтобы закодировать файл в utf-8, я открываю файл вNotepad ++, который может читать огромные файлы, я вручную удаляю ÿþ в начале файла, затем меняю кодировку на utf-8 и сохраняю как новый файл.

Notepad ++ говорит, что кодировка файла: UCS-2 LE BOM

Размер файла увеличивается с 1,8 МБ до 0,9 МБ, теперь я могу без проблем открыть этот файл с пандами.

Так что я думаю, что преобразование в utf-8 должно быть частью моей предварительной обработки.

Я использовал это решение: Как преобразовать файл в utf-8 в Python? и создал функцию для преобразования нескольких файлов:

BLOCKSIZE = 1048576 # or some other, desired size in bytes

def convert_utf8(sourceFileName, targetFileName, sourceEncoding='iso-8859-1'):
    with codecs.open(sourceFileName, "r", sourceEncoding) as sourceFile:
        with codecs.open(targetFileName, "w", "utf-8") as targetFile:
            while True:
                contents = sourceFile.read(BLOCKSIZE)
                if not contents:
                    break
                targetFile.write(contents)

Теперь проблема в том, что когда файл записывается, он добавляет символ NULL после каждого действительного символа, позвольте мне показать его в редакторе:

enter image description here

Этот файл, конечно, не работает в Pandas.Пока что я решил свою проблему с помощью Notepad ++, но, конечно, должен быть лучший способ, чтобы мне не приходилось полагаться на другие инструменты.

1 Ответ

0 голосов
/ 04 января 2019

Чтобы преобразовать файл из одной кодировки в другую в Python:

with open('file1.txt',encoding='utf16') as fin:
   with open('file2.txt','w',encoding='utf8') as fout:
       fout.write(fin.read())

Но в вашем случае, как отметил Марк Рэнсом в комментарии, просто откройте соответствующую кодировку:

bmc = pd.read_csv('file.csv', sep='|', error_bad_lines=False, encoding='utf16')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...