【问题标题】:how to guess file encoding如何猜测文件编码
【发布时间】:2018-10-07 13:19:58
【问题描述】:

我有一个文件(来自美国国会图书馆的作者列表),其中包含以下行:

Arteaga, Ana Mar�ia
Corval�an-V�asquez, Oscar E.

(打印到 linux 控制台时)

我想读这些(读入熊猫数据框或一组行)

  df = pd.read_csv(fname, sep='\t', header='infer', lineterminator=None,encoding='latin1') #lineterminator \r\n hits error    

with open(fname,'r',encoding='ISO-8859-1') as fp: 
    lines=fp.readlines()

但两者都不完全正确,给我这样的输出

阿蒂亚加,安娜·玛拉亚

(再次打印到控制台时) 当我很确定这里的实际名字应该是玛丽亚时。

有人认识这种格式吗?

【问题讨论】:

  • 你得到字节的来源说字符编码是什么?你能回过头来问问(或者听,比如 Content-Type HTTP 响应头)吗?
  • 名字应该是 Arteaga, Ana MaríaCorvalán Vásquez, Oscar E.。因此,无论替换字符(黑色菱形中的问号)出现在哪里,它都位于应该重音的字符旁边。这可能表明原始文件是 UTF-8。使用 hexdump 工具检查重音字符是否需要一个字节 (ISO-8559-1) 或两个字节 (UTF-8)。请注意,编码不匹配也可能是由于您的控制台造成的。它也需要配置正确的编码。
  • 原始文件在 Marâi 的âi处有 0xE269。如果将其视为一个字节/字符,那么您确实会得到 âi,而如果您将 E269 视为一个两字节代码点,它指向一个私有用户区域,我不认为这是预期的。我在这个文件中也看到了一个“Josâe”,又是 0xE2 出现在 e 之前,所以看起来 0xE2 被用来表示即将到来的字符的重音版本。这听起来像是某人已知的格式吗?

标签: pandas utf-8 iso-8859-1


【解决方案1】:

好的,这似乎是 'marc-8' 格式。

yaz-iconv -f marc8 -t utf8 infile.txt  > outfile.txt

负责转换为 utf8 ,唯一的问题是 yaz 杀死了所有行终止符(对于文件的 \r\n 和 \n 版本)。

那些可以用类似于

的东西返回
sed 's/\[/\n\[/g' outfile.txt > outfile_utf.txt

(例如在我的例子中,每行都以'['字符开头)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多