Любой способ получить правильное преобразование для данных текстового формата Unicode в CSV в python? - PullRequest
1 голос
/ 15 января 2020

Я получаю доступ к набору данных, который находится на FTP-сервере. после загрузки данных я использовал pandas, чтобы прочитать их как csv, но получил ошибку кодирования. Файл имеет расширение csv, но после того, как я открыл файл с MS Excell, данные были в формате Unicode Text. Я хочу сделать преобразование тех наборов данных, которые хранятся в текстовом формате Unicode. Как я могу это сделать? Любая идея, чтобы сделать это?

моя попытка :

from ftplib import FTP
import os

def mydef():
defaultIP=''
username='cat'
password='cat'

ftp = FTP(defaultIP,user=username, passwd=password)
ftp.dir()

filenames=ftp.nlst() 

for filename in files:
    local_filename = os.path.join('C:\\Users\\me', filename)
    file = open(local_filename, 'wb')
    ftp.retrbinary('RETR '+ filename, file.write)

    file.close()

ftp.quit()

тогда я попытался это получить правильную кодировку:

mydef.encode('utf-8').splitlines()

но этот не работает для меня. Я использовал это решение

вывод кода выше :

здесь приведен фрагмент кода выше:

Ь '\ XFF \ xfeF \ x00L \ x00O \ x00W \ x00 \ т \ x00C \ x00T \ x00Y \ x00_ \ x00R \ x00P \ x00T \ x00 \ т \ x00R \ x00E \ x00P \ x00O \ x00R \ x00T \ x00E \ x00R \ x00 \ т \ x00C \ x00T \ x00Y \ x00_ \ x00P \ x00T \ x00N \ x00 \ т \ x00P \ x00A \ x00R \ x00T \ x00N \ x00E \ x00R \ x00 \ т \ x00C \ x00O \ x00M \ x00M \ x00O \ x00D \ x00I \ x00T \ x00Y \ x00 \ t \ x00D \ x00E \ x00S \ x00C \ x00I \ x00P \ x00T \ x00I \ x00O \ x00N \ x00 \ t '

ожидаемый вывод

ожидаемый вывод этого набора данных должен быть в обычных csv данных, таких как данные обычной торговли, но кодирование не работает для меня.

Я использовал другую кодировку для получения правильного преобразования данных формата csv, но ни одна из них не работает для меня. Как я могу заставить эту работу? Любая идея, чтобы сделать это? спасибо

1 Ответ

2 голосов
/ 15 января 2020

РЕДАКТИРОВАТЬ: Я должен изменить его - теперь я удаляю 2 байта в начале (BOM) и один байт в конце, потому что данные неполны (каждый символ требует 2 байта)


Кажется, это не utf-8, а utf-16 с BOM

Если я удаляю первые два байта (BOM - Bytes Order Mark) и последний байт в конце, потому что он неполный (каждому символу требуется два байта) и использует decode('utf-16-le')

b'F\x00L\x00O\x00W\x00\t\x00C\x00T\x00Y\x00_\x00R\x00P\x00T\x00\t\x00R\x00E\x00P\x00O\x00R\x00T\x00E\x00R\x00\t\x00C\x00T\x00Y\x00_\x00P\x00T\x00N\x00\t\x00P\x00A\x00R\x00T\x00N\x00E\x00R\x00\t\x00C\x00O\x00M\x00M\x00O\x00D\x00I\x00T\x00Y\x00\t\x00D\x00E\x00S\x00C\x00R\x00I\x00P\x00T\x00I\x00O\x00N\x00'.decode('utf-16-le')

, тогда я получаю

'FLOW\tCTY_RPT\tREPORTER\tCTY_PTN\tPARTNER\tCOMMODITY\tDESCRIPTION'

РЕДАКТИРОВАТЬ: тем временем я нашел также Python - Расшифруйте файл UTF-16 с помощью спецификации

...