2017-07-15 11 views
-2

テキストファイルに保存したjson-stringをPythonに読み込もうとしています。私はそれを空のファイルを与えるとき、JSON-モジュールは私にエラーを与えているので、私は次のようでした:なぜelse節がこのif、elif、else(最初の2つのうちの1つの代わりに)で実行されていますか?

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へのそのどれも見つけていないことは非常に驚きましたsが実行され得るが、私が追加した場合、代わりに:

else: 
    print('something') 

それは実際にsomethingを印刷します。なぜこうなった?どのようにして論理的に何か、その否定、そして何か他のものが存在することができますか?あなたが最初の比較が失敗した場合、再びをfp.readlines()を呼び出して、そのファイルを2回読みしようとしている

+0

最初の 'fp.readlines()'はファイル全体を読み込むため、次の行は読み込みに失敗する(さらに)行を返します。あなたはそれらの間でファイルを巻き戻し、再び 'close'と' open'する必要があります。また、最初の結果を変数に保存し、その時点から使用する必要があります。 – martineau

答えて

2

...あなたが(例えば)に必要な別の変数に最初の時間を節約し、

それを2番目に再利用してください。あなたはまた、自分の元のバージョンでelseを使用するが、その後(再び)あなたが実際の行へのアクセスを持っていないでしょう...

そしてファイルかどうかを判断するためのより良い方法があるかもしれない可能性が

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 

空/存在しない(同じものではない)。

+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 

は、この情報がお役に立てば幸いです。

関連する問題