2017-07-15 51 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 

希望这有助于。