读取未知编码的文件

时间:2014-09-30 13:24:22

标签: python file-io encoding character-encoding

我尝试使用奇怪的编码加载文件的列。 Windows似乎没有问题打开它,但Linux抱怨并且我只能使用Atom文本编辑器打开它(其他人给我一个空白文件或带有数据编码的文件)

命令:

file -i data_file.tit

返回:

application/octet-stream; charset=binary

以二进制模式打开文件并读取前400个字节给出:

'0905077U1- a\r\nIntegration time: 19,00 ms\r\nAverage: 25 scans\r\nNr of pixels used for smoothing: 2\r\nData measured with spectrometer name: 0905077U1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\nWave ;Dark ;Ref ;Sample ;Absolute Irradiance ;Photon Counts\r\n[nm] ;[counts] ;[counts] ;[counts] ;[\xb5Watt/cm\xb2/nm] ;[\xb5Mol/s/m\xb2/nm]\r\n247,40;-1,0378;18,713;10,738;21,132;0,4369\r\n247,'

文件的其余部分仅由以分号分隔的ASCII数字组成。

我尝试了以下方法来加载文件:

with open('data_file.tit') as f:
    bytes = f.read() # (1)
    # bytes = f.read().decode('???')  # (2)
    # bytes = np.genfromtxt(f)  # (3)
    print bytes
  • (1)排序有效但跳过前几百行。

  • (2)对于我尝试过的每个encoding都失败了:

    codec can't decode byte 0xb5 in position 315: unexpected special character
    
  • (3)抱怨ValueError: Some errors were detected !并为每一行显示与Line #3 (got 3 columns instead of 2)类似的内容。

如何加载此数据文件?

2 个答案:

答案 0 :(得分:4)

猜测编码真的很难,幸运的是有一个图书馆试图帮助解决这个问题:https://pypi.python.org/pypi/chardet

答案 1 :(得分:4)

您有一个codepage 1252编码的文本文件,其中一行包含NULL字节。 file命令确定您有基于这些NULL的二进制数据,而我根据\xb2\xb5代码点进行了有根据的猜测,代表{{1} }和²个字符。

要打开,只需从该编码解码:

µ

然后是前10行:

import io

with io.open(filename, 'r', encoding='cp1252') as f:
    for line in f:
        print(line.rstrip('\n\x00'))

使用光谱仪名称测量的数据中删除了NULL:0905077U1 行; spetrometer名称现在是9个字节长,再加上55个NULL,看起来名称最长可达64个字符,文件编写者也不会去除那些NULL。