2017-07-15 32 views
-2

我想加載json字符串,我保存到文本文件回到Python。由於JSON模塊給了我一個錯誤,當我給它一個空文件,我做了以下內容:爲什麼else子句在這個if中執行,elif,else(而不是前兩個中的一個)?

fp = open(filename, 'r') 

if fp.readlines() == [] 
    # return an empty list, since the file is empty 
elif fp.readlines() != [] 
    # return the converted list 

因爲我現在有兩個if a == bif a != b,我很驚訝地發現,沒有一個以if如果我加上:

else: 
    print('something') 

它實際上打印something。這是爲什麼發生?在邏輯上如何存在某些東西,它的否定,然後是其他東西?

+0

第一個'fp.readlines()'讀取整個文件,所以下一個不會返回(進一步)行讀取。您需要在它們之間回捲文件,「關閉」並再次「打開」它,或者將第一次結果保存在變量中並從該點開始使用它。 – martineau

回答

2

你再打電話給fp.readlines()如果第一個比較失敗,所以嘗試讀取文件兩次...

你需要(例如)將其保存在單獨的變量中第一次,然後重新使用它。

fp = open(filename, 'r') 
lines = fp.readlines() 
if lines == []: 
    # return an empty list, since the file is empty 
elif lines != []: ### or just "else:" 
    # return the converted list 

你也可以只使用else與原來的版本,但隨後(再一次),你就不會進入實際行...

而且有可能是更好的方法來確定一個文件是空的/不存在(不一樣的東西)。

+0

但是爲什麼當我調用相同的函數時會返回不同的東西?我沒有更改文件。 – pfincent

+0

一旦運行了'fp.readlines()',你就不能再次執行了 - 當你打開文件時有一個指向開頭的「指針」,但是現在運行'fp.readlines()'後指向最後,所以更進一步的'fp.readlines()'不會達到你所期望的。 –

+0

當從一個文件讀取json數據時,你應該使用'fp.read()'當某個東西返回一個錯誤時,這是​​一件好事情,因爲在Python中你可以捕獲異常看我的答案,它應該爲你清除它。 – lillypad

0
#!/usr/bin/env python 

import json 

file_path = "myfile.json" 

def read_json_file(file_path): 
    try: 
     f = open(file_path, 'r') 
     data = json.loads(f.read()) 
     return data 
    except Exception as e: 
     return False 

data = read_json_file(file_path) 

if data: 
    print(json.dumps(data, indent=4)) 
else: 
    print("File Empty or Invalid JSON Data") 

我會推薦嘗試這種方法,請記住,嘗試和除了是你的朋友。

如果您需要明確地檢查該文件是空的,你可以這樣做:

import os 

if os.stat(file_path).st_size > 0: 
    #Try reading the file 

希望這有助於。

相關問題