2017-08-02 49 views
0

我正在使用Django v1.11和Python。我試圖上傳一個文件,然後解析它。該文件有一些奇怪的編碼,所以我最初寫了一個測試腳本,發現該文件使用utf-16編碼。與測試腳本(這在我以前的Django以外)我使用:Django/Python - 無法解碼FILE上傳

inputFile = open(inputFilePath, 'rt', encoding='utf-16') 

當使用Django,我無法做解碼。在我的views.py我使用:

if "specFile" in request.FILES: 
    specFilePath = request.FILES['specFile'] 
    if(request.POST['specType'] == 'Absorbance'): 
     doStuff(specFilePath) 

都到了簡單的方法:

def doStuff(specFilePath): 
    for line in specFilePath: 
     print(line) 

在這裏我得到編碼的文本:

b'\xff\xfe#\x00#\x00B\x00L\x00O\x00C\x00K\x00S\x00=\x00 \x006\x00\r' 
b'\x00\n' 
b'\x00P\x00l\x00a\x00t\x00e\x00:\x00\t\x00e\x001\x00\t\x001\x00.\x003\x00\t\x00P\x00l\x00a\x00t\x00e\x00F\x00o\x00r\x00m\x00a\x00t\x00\t\x00E\x00n\x00d\x00p\x00o\x00i\x00n\x00t\x00\t\x00A\x00b\x00s\x00o\x00r\x00b\x00a\x00n\x00c\x00e\x00\t\x00R\x00a\x00w\x00\t\x00F\x00A\x00L\x00S\x00E\x00\t\x001\x00\t\x00\t\x00\t\x00\t\x00\t\x00\t\x002\x00\t\x002\x006\x000\x00 \x002\x008\x000\x00 \x00\t\x001\x00\t\x002\x004\x00\t\x003\x008\x004\x00\t\x001\x00\t\x001\x006\x00\t\x00\t\x00\r' 
    ... 

When putting in 
    line = line.decode(encoding='latin1') 

b'\xff\xfe#\x00#\x00B\x00L\x00O\x00C\x00K\x00S\x00=\x00 \x006\x00\r' 
b'\x00\n' 
b'\x00P\x00l\x00a\x00t\x00e\x00:\x00\t\x00e\x001\x00\t\x001\x00.\x003\x00\t\x00P\x00l\x00a\x00t\x00e\x00F\x00o\x00r\x00m\x00a\x00t\x00\t\x00E\x00n\x00d\x00p\x00o\x00i\x00n\x00t\x00\t\x00A\x00b\x00s\x00o\x00r\x00b\x00a\x00n\x00c\x00e\x00\t\x00R\x00a\x00w\x00\t\x00F\x00A\x00L\x00S\x00E\x00\t\x001\x00\t\x00\t\x00\t\x00\t\x00\t\x00\t\x002\x00\t\x002\x006\x000\x00 \x002\x008\x000\x00 \x00\t\x001\x00\t\x002\x004\x00\t\x003\x008\x004\x00\t\x001\x00\t\x001\x006\x00\t\x00\t\x00\r' 
... 

推杆
line = line.decode(encoding='utf-16') 

我收到了錯誤信息: UnicodeDecodeError:'utf-16-le' codec can't decode byte 0x0d in position 24: truncated data

我不知道該從哪裏出發。有沒有其他方法可以解碼? 此外,道歉在這個問題上的任何錯誤或錯誤的措辭。這是我第一次提出的Stack Overflow問題,Django/Python只是我在藥物發現平臺開發科學方面工作中使用的工具。

+0

無論將文件拆分爲行,都不知道它是UTF16,而是將其拆分爲單字節字符,這在這裏甚至沒有意義。您需要以某種方式讓Django在分割行之前將該文件視爲UTF16;對不起,這有點超出我的經驗。 – jasonharper

+0

你是如何找到用'utf-16'編碼的? –

回答

0

我想出了一個相當janky的解決方案,似乎工作:

line = line.strip().replace('\xff', '').replace('\xfe', '').replace('\x00', '').rstrip() 

這似乎是通過消除\ XFF類型的東西做的伎倆。 這些問題來自Molecular Devices Spectromax吸光度/熒光板讀數器的數據文件,並且爲了便於參考和輕鬆使用Google搜索。