Python 读取编码未知的文件

Python 读取编码未知的文件,python,file,encoding,file-io,character-encoding,Python,File,Encoding,File Io,Character Encoding,我试图用一种奇怪的编码加载文件的列。Windows在打开它时似乎没有问题,但Linux有问题,我只能使用文本编辑器打开它(其他人给我一个空白文件或一个数据编码的文件) 命令: file -i data_file.tit 返回: application/octet-stream; charset=binary 以二进制模式打开文件并读取前400个字节,可以得到: '0905077U1-a\r\n积分时间:19,00 ms\r\n平均值:25次扫描\r\nR用于平滑的像素:2\r\n使用光谱仪名

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

命令:

file -i data_file.tit
返回:

application/octet-stream; charset=binary
以二进制模式打开文件并读取前400个字节,可以得到:

'0905077U1-a\r\n积分时间:19,00 ms\r\n平均值:25次扫描\r\nR用于平滑的像素:2\r\n使用光谱仪名称测量的数据: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;黑暗;裁判;样品绝对辐照度;光子计数\r\n[nm];[计数];[计数];[计数];[\xB5W/cm\xb2/nm];[\xb5Mol/s/m\xb2/nm]\r\n247,40-1,0378;18,713;10,738;21,132;04369\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)
    每次尝试都失败,错误如下:

    codec can't decode byte 0xb5 in position 315: unexpected special character
    
  • (3)
    投诉
    ValueError:检测到一些错误并为每行显示类似于
    行#3的内容(得到3列而不是2列)


如何加载此数据文件?

猜测编码可能非常困难,幸运的是,有一个库试图帮助实现这一点:

您有一个编码的文本文件,其中一行包含空字节。
file
命令确定您有基于这些空值的二进制数据,而我根据
\xb2
\xb5
代码点(代表
²
µ
字符)进行了有根据的猜测

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

import io

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

0905077U1- a
Integration time: 19,00 ms
Average: 25 scans
Nr of pixels used for smoothing: 2
Data measured with spectrometer name: 0905077U1
Wave   ;Dark     ;Ref      ;Sample   ;Absolute Irradiance  ;Photon Counts
[nm]   ;[counts] ;[counts] ;[counts] ;[µWatt/cm²/nm]       ;[µMol/s/m²/nm]
247,40;-1,0378;18,713;10,738;21,132;0,4369
247,57;3,0793;19,702;9,5951;11,105;0,2298
247,74;-0,9414;19,929;8,8908;16,567;0,3430

从光谱仪名称为0905077U1的测得数据中去除零位;spetrometer名称现在有9个字节长,加上55个空值。看起来名称的长度可能高达64个字符,而文件编写器没有费心去掉这些空值。

我们不可能知道。你有随机数据,恐怕我们不是透视者。@MartijnPieters你是什么意思?我贴了一个文件的链接,我没有隐藏它。但是你的问题需要是独立的;不要期望人们从互联网上下载随机数据!猜测文件的编码对其他任何人都没有帮助。我还可以如何共享数据文件?如果我将内容粘贴到这里,它们不会被页面覆盖或更改编码吗?找到一种方法来识别编码是问题的一部分。
repr()
可以为您提供数据的Python表示。以二进制模式(
'rb'
)打开文件,并给我们一个示例。谢谢@Martijn。当我尝试此操作时,我得到:
UnicodeEncodeError:'ascii'编解码器无法对39位的字符u'\xb5'进行编码:序号不在范围(128)
。问题在于第7行中的$\mu$字符。有没有办法跳过阅读这些内容?@Gabriel:你正在尝试解码已经是Unicode的数据。别那么做。我只是想用你的答案来读文件,我发誓,没有别的。我不知道为什么会出现这样的错误,我试着在你的答案中使用
\xb5
而不是
\n\x00
来剥离这些字符,但是没有用。@Gabriel:试试
打印行.rstrip('\n\x00')。编码('ascii','replace')
;这将强制编码为ASCII,忽略4个非ASCII字符。这样,您至少可以看到文件内容。@Gabriel:那么您的控制台或终端只能处理ASCII输出。这可能是一个愚蠢的问题,但您不能使用try:except:重复使用不同的编码猜测,直到没有错误为止?这样行吗?我正在编写读取csv文件的代码,但对于一个将创建自己文件的客户机,所以我不知道它们可能是什么编码。谢谢。不愚蠢,但也不是蟒蛇。chardet会用这个技巧,所以就用它吧。