【问题标题】:Any way to get correct conversion for unicode text format data to csv in python?有什么方法可以在python中将unicode文本格式数据正确转换为csv?
【发布时间】:2020-05-01 15:33:10
【问题描述】:

我正在访问 ftp 服务器上的数据集。下载数据后,我使用pandas 将其读取为csv,但出现编码错误。该文件具有csv 文件扩展名,但在我用MS Excel 打开文件后,数据为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()

但是这个对我不起作用。我用this solution

以上代码的输出

这是上面代码的输出sn-p:

b'\xff\xfeF\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\t'

预期输出

此数据集的预期输出应该是普通的csv 数据,例如常见的贸易数据,但编码对我不起作用。

我使用不同的编码来正确转换csv 格式数据,但它们都不适合我。我怎样才能使它工作?有什么想法可以完成吗?谢谢

【问题讨论】:

  • 如果是 CSV 文件,然后在普通文本编辑器中打开它,看看你有什么。它看起来不像 CSV 文件。或者它可能不使用utf-8,而是使用其他编码 - 即。 utf-16。 `utf-16 有时在 Windows 上使用。

标签: python csv python-unicode


【解决方案1】:

编辑:我必须更改它 - 现在我删除开头的 2 个字节 (BOM) 和末尾的一个字节,因为数据不完整(每个字符需要 2 个字节)


看来不是utf-8而是utf-16BOM

如果我删除前两个字节(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 - Decode UTF-16 file with BOM

【讨论】:

  • UTF-16 中的 BOM 是 2 个字节,而不是 3 个。
  • 我无法解码,所以我删除了第三个字节 - 但我发现问题 - 文本不完整,我必须删除最后一个字节,然后我可以在开头删除 2 个字节的 BOM 并解码。
  • @MarkRansom 我更改了它 - 我必须删除最后一个字节而不是开头的第三个字节。
  • @furas 有没有更一致的解决方案,而不是手动删除第三个字节?因为实际输出 sn-p 很多
  • 阅读我当前的答案 - 现在我一开始只删除两个字节,因为 BOM 有 2 个字节 - 如果您使用完整数据,那么您不必删除第三个字节 - 但我必须删除,因为您给出了不完整的数据,并且它不适用于最后一个字节。在 UTF-16 中,每个字符使用 2 个字节,数据需要偶数字节来解码。
猜你喜欢
  • 2020-05-19
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多