2015-12-30 84 views
0

我有這個文件寫入功能:文件寫入和文件以UTF-16閱讀蟒蛇

def filewrite(folderpath, filename, strdata, encmode): 
try: 
    path = os.path.join(folderpath, filename) 
    if not path: 
     return 
    create_dir_path(folderpath) 
    #path = os.path.join(folderpath, filepath) 

    with codecs.open(path, mode='w', encoding=encmode) as fp: 
     fp.write(unicode(strdata)) 
except Exception, e: 
    raise Exception(e) 

其正在使用將數據寫入一個文件:

filewrite(folderpath, filename, strdata, 'utf-16') 

但是,當如果嘗試閱讀該文件我得到異常:

Exception: UTF-16 stream does not start with BOM 

我的文件讀取功能,如下所示:

def read_in_chunks(file_object, chunk_size=4096): 
try: 
    while True: 
     data = file_object.read(chunk_size) 
     if not data: 
      break 
     yield data 
except Exception, ex: 
    raise ex 


def fileread(folderPath, fileName, encmode): 
try: 
    path = os.path.join(folderPath, fileName) 
    fileData = '' 
    if os.access(path, os.R_OK): 
     with codecs.open(path, mode='r', encoding=encmode) as fp: 
      for block in read_in_chunks(fp): 
       fileData = fileData + block 
     return fileData 
    return '' 
except Exception, ex: 
    raise ex 

請讓我知道這裏做錯了什麼。

謝謝

回答

0

你的代碼沒有出現任何問題。在我的機器上運行它會自動在文件開始時創建適當的BOM。

BOM是文件開始處的一系列字節,用於指示應讀取哪些順序多字節編碼(UTF-16) - 如果您有興趣,可以閱讀system endianness

如果您在mac/linux上運行,您應該能夠hd your_utf16filehexdump your_utf16file檢查文件內的原始字節。運行你的代碼我在我的開頭看到了正確的字節0xff 0xfe。

嘗試

with codecs.open(path, mode='r', encoding=encmode) as fp: 
     for block in fp: 
      print block 

免去您fileread功能部分,以確保您仍然可以讀取該文件排除外部因素後(您read_in_chunks功能)。

+0

在x64機器上(Windows 8.1)。試圖刪除'read_in_chunks'以及。由於某種原因無法使其工作。 – Harsh

+0

它是'codecs.open(path,mode ='r',encoding = encmode)爲fp:'引發異常?確保用'raise'替換'raise ex',否則它會掩蓋異常開始的真實位置。 –