今天利用Python讀取一個json文件
def read_file(file_path): file_content = "" if os.path.isfile(file_path): with open(file_path, "r", encoding='utf-8', errors='ignore') as file_obj: while 1: content_chunk = file_obj.read(1024) if not content_chunk: break file_content += content_chunk return file_content
文件是可以讀取出來,出來的的json 文件是列表字符串.需要轉換成列表,我是用的是eval函數
經過查看是讀取出來的文件前面增加了一個\ufeff
原因分析
utf-8編碼的文件時開頭會有一個多余的字符\ufeff,在讀文件時會讀到\ufeff
輸出的\ufeff到底是哪里來的呢?
在編寫文本時保存時包含了BOM(Byte Order Mark,字節順序標記,出現在文本文件頭部,Unicode編碼標准中用於標識文件是采用哪種格式的編碼)導致最后輸出了\ufeff。
其實就是相當於你當初的文件是寫在txt文件中,但是沒有制定utf8編碼,之后將文件改為其它后綴指定了其它編碼導致
解決方案1:
再讀取文件的時候使用encoding='UTF-8-sig'
解決方案2:
把原來的json文件復制出來到sublime里面使用utf8編碼保存替換原來的json文件
因為我是調用的公共方法,所以盡量不對公共方法做修改,采用第二種方案.
utf-8與utf-8-sig兩種編碼格式有什么區別呢?
UTF-8以字節為編碼單元,它的字節順序在所有系統中都是一様的,沒有字節序的問題,也因此它實際上並不需要BOM(“ByteOrder Mark”)。但是UTF-8 with BOM即utf-8-sig需要提供BOM。
\ufeff到底是什么?
字節順序標記(英語:byte-order mark,BOM)是位於碼點U+FEFF的統一碼字符的名稱。當以UTF-16或UTF-32來將UCS/統一碼字符所組成的字符串編碼時,這個字符被用來標示其字節序。它常被用來當做標示文件是以UTF-8、UTF-16或UTF-32編碼的記號。