2016-11-11 2 views
0

プレイリストは、サイズに基づいてディレクトリにアップロードされています。Python - vs updateファイルを置き換えます。

最初、私は空のディレクトリに次のdictをアップロード:

playlist_pre = {'user1': {u'Codex': 1.0, u'High And Dry': 1.0, u'Hey': 1.0, u'O': 1.0, u'Videotape': 1.0, u'Pyramid Song': 1.0}} 

そして、この1:

playlist_pos = {'user1': {u'With Or Without You - Jo Whiley Show - BBC Live Session': 1.0, u'Codex': 1.0, u'Daydreaming': 1.0, u'The Man Who Sold The World - 2015 Remastered Version': 1.0, u'High And Dry': 1.0, u'Hey': 1.0, u'O': 1.0, u'Sparks': 1.0, u'Videotape': 1.0, u'Asleep - 2011 Remastered Version': 1.0, u'Pyramid Song': 1.0, u'Nude': 1.0}} 

これは私が何度も何度も、ディレクトリへのプレイリストをアップロードする方法です:

if os.path.exists('db/user1.json'): 
     if len(playlist_pos['user1'].values()) < 3: 
      with open('db/user1.json', 'r+') as f: 
       db = playlist_pos 
       db = json.load(f) 
       # increment track count 
       updateTrackCounts(db,value=1.0) 
       #update json here 
       f.seek(0) 
       f.truncate() 
       json.dump(db, f) 
       print (db) 
     else: 
      with open('db/user1.json', 'r+') as f: 
       db = playlist_pos 
       db = json.load(f) 
       # increment track count 
       updateTrackCounts(db,value=1.0) 
       #update json here 
       f.seek(0) 
       f.truncate() 
       json.dump(db, f) 
       print (db) 

これは最初のアップロード方法です(playlist_pre)長門

else: 
    if len(playlist_pre['user1'].values()) < 3: 
     with open('db/user1.json', 'w') as f: 
      json.dump(playlist_pre, f) 
    else: 
     with open('db/user1.json', 'w') as f: 
      json.dump(playlist_pre, f) 

PS:functionが呼び出される:

def updateTrackCounts(d, value=0): 
    for i in d: 
     if isinstance(d[i], dict): 
      updateTrackCounts(d[i], value) 
     elif isinstance(d[i], float): 
      d[i] += value 

EDIT

playlist_preplaylist_pos後に生成された場合、これは、出力が所望される:前と後のプレイリストを接合する新しいファイル。

繰り返しトラックがincremented value持っている、と新しいトラックはdefault value = 1.0

joined_playlist = {'user1': 
{u'Codex': 2.0, u'High And Dry': 2.0, u'Hey': 2.0, u'O': 2.0, u'Videotape': 2.0, u'Pyramid Song': 2.0, u'With Or Without You - Jo Whiley Show - BBC Live Session': 1.0, u'Daydreaming': 1.0, u'The Man Who Sold The World - 2015 Remastered Version': 1.0, u'O': 1.0, u'Sparks': 1.0, u'Asleep - 2011 Remastered Version': 1.0, u'Nude': 1.0}} 
+0

あなたは常に 'db = json.load(f)'をロードしていて、常に 'user1.json'を指しているようです。 – sal

+0

これを修正するにはどうすればよいですか? –

+0

'db = playlist2'と' db = playslist1'の文の後には、同じ 'db = json.load(f)'が続きます:なぜあなたは変数を上書きしていますか? – sal

答えて

0

db変数が誤って上書きされ、したがって、常にdb/user1.jsonからデータをロードされることを私には思える持っています。 速いの修正は、両方のブランチのdb = json.load(f)ステートメントをコメントアウトすることです。結局、ファイルの内容を完全に書き換えたいとします。彼らはまったく同じロジックを繰り返すよう

は、私はまた、機能として2つのコード・ブロックを実装していますが、これはそれがより読みやすく、デバッグが容易になります: はより多くのように見える

import os 
import json 

playlist1 = {'user1': {u'Codex': 1.0, u'High And Dry': 1.0, u'Hey': 1.0, u'O': 1.0, u'Videotape': 1.0, u'Pyramid Song': 1.0}} 
playlist2 = {'user1': {u'With Or Without You - Jo Whiley Show - BBC Live Session': 1.0, u'Codex': 1.0, u'Daydreaming': 1.0, u'The Man Who Sold The World - 2015 Remastered Version': 1.0, u'High And Dry': 1.0, u'Hey': 1.0, u'O': 1.0, u'Sparks': 1.0, u'Videotape': 1.0, u'Asleep - 2011 Remastered Version': 1.0, u'Pyramid Song': 1.0, u'Nude': 1.0}} 


def updateTrackCounts(d, value=0): 
    for i in d: 
     if isinstance(d[i], dict): 
      updateTrackCounts(d[i], value) 
     elif isinstance(d[i], float): 
      d[i] += value 


def update_and_save_playlist(playlist, filepath): 
    with open(filepath, 'r+') as f: 
     db = playlist 
     # increment track count 
     updateTrackCounts(db, value=1.0) 
     # update json here 
     f.seek(0) 
     f.truncate() 
     json.dump(db, f) 
     print (db) 


def save_playlist(playlist, filepath): 
    with open(filepath, 'w') as f: 
     json.dump(playlist, f) 


if os.path.exists('db/user1.json'): 
    if len(playlist1['user1'].values()) < 3: 
     # save playlist 2 
     update_and_save_playlist(playlist2, 'db/user1.json') 
    else: 
     # save playlist 1 
     update_and_save_playlist(playlist1, 'db/user1.json') 
else: 
    if len(playlist1['user1'].values()) < 3: 
     save_playlist(playlist2, 'db/user1.json') 
    else: 
     save_playlist(playlist1, 'db/user1.json') 

EDIT の問題 2つのプレイリスト、pre/pos。そのためにupdateTrackCountsに調整が必要です。 newプレイリストがoldよりも多くのデータが含まれていますので、一つの方法は、updateTrackCounts両方のプレイリストを供給することで、それは古いものに存在するトラックに基づいて、インプレース新しいものを更新しなければなりません:

def updateTrackCounts(new_dict, old_dict, value=0): 
    # new_dict will have the same or more data than old_dict 
    for user, new_tracks in new_dict.items(): 
     # check if this user, and the tracks were in the old dict 
     if user in old_dict: 
      for old_track in old_dict[user]: 
       if old_track in new_tracks: 
        new_dict[user][old_track] += value 
使い方の例については、呼び出した後

を:

updateTrackCounts(playlist_pos, playlist_pre, value=1.0) 

playlist_posこれはADJが必要な場合がありますjoined_playlist

と同じになりますあなたの目標に基づく腐敗:例えば、これは、古いものと新しいものが同じである場合と変更が起こらなかった場合を考慮に入れません。

+0

私は増分された値で新しいプレイリストを手に入れましたが、インクリメントされた値は以前に存在したトラックにしか意味がありません。私は所望の出力を明確にする編集を投稿しました:デフォルト値= 1.0の新しいトラックと、増分された値を持つ繰り返しのトラック。あなたはまだ助けてくださいできますか? –

関連する問題