這里主要說最近遇到的一個問題,不過目前只是換了一種思路先解決了,腦子里仍然有疑惑,只能怪自己太菜。
最近要把以前爬的數據用一下了,先簡單的過濾一下,以前用scrapy存數據的時候為了省事也為了用一下它的item exporter,將數據持久化,用了jsonlinesitemexporter,並且導出到一個json文件(現在我有點后悔)。當我讀文件,遍歷每行,json.loads每行時,沒錯,驚喜出現了。
def cf_movie(): with open('movies.json', 'r') as fp: for l in fp: mj = json.loads(l)
wstr = mj['name'] f.write(wstr.encode('utf-8')) print 'done'
ValueError: Expecting property name: line 1 column 137 (char 136)
當時就蒙了,難道我導出去json格式,再用json來loads就不行了?不能說我打開文件方式不對吧,而且遍歷方式以前一直在用,錯誤出在loads那里。其實我是有點較真的,導出的文件有TXT格式的,我拿一個試了試,一點錯沒有。Google百度了一大堆,都是說字符串格式問題,不過這不是我的錯,我導出的就是json格式,所以格式不會有錯,而且我還專門確認了一下。我表示不服,不過沒道理的呀,我試着一行一行讀(試幾行),可以loads沒錯。我甚至把遍歷文件的三種方式都試了一遍,仍然報錯。突然想到當初看scrapy文檔時,有講到json處理大文件不方便,難道是因為我文件是json的問題?我換了一個小的json文件,果然沒問題。現在基本確定是json文件大小的問題,不過Python得json模塊里沒說這個問題。但數據還是要過濾的,我試了一下,我的json文件有大概2萬行,設一個flag測讀多少行,最高設到8000,9000就報錯,然后8500頁報錯,所以8000是可以的。這樣就有一個思路,將文件分解為多個不報錯的小文件,然后再解析、過濾。不過我的測試文件才2M左右,我還有400多M的,這樣豈不是很剛。想了想我決定先不用這種思路,想到了以前學Python基礎的時候無意看到一個函數eval,將字符串轉為字典,我的字符串符合字典格式(肯定的),所以我決定用這種方式,目前很流暢,不過前提是你的字符串格式要對。
不過我目前還是沒懂為什么loads會報錯,用TXT格式文件卻不報錯,經歷了從有想法到放棄,心有疑惑。