2016-11-11 58 views
0

我已经根据播放列表的大小将播放列表上传到目录中。Python - 替换vs更新文件

首先我上传以下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}} 

那么,这一个:

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上传到空的di教区长。

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_pos之后产生playlist_pre:一个新的文件接合之前和之后的播放列表;

重复曲目有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)语句:毕竟,您要完全重写文件内容。

我虽然也实现了两个代码块的功能,因为它们重复完全相同的逻辑,这使得它更容易阅读和调试:

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') 

编辑 看起来更像是一个问题合并两个播放列表,前/后。为此,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将是相同joined_playlist

这可能需要ADJ以你的目标为基础的例子:例如,这并没有考虑到新旧情况相同而没有发生变化的情况。

+0

我得到增加值的新播放列表好吧,但递增值只适用于之前跟踪目前。我发布了一个编辑来澄清所需输出:默认值为1.0的新曲目和增加值的重复曲目。你还能帮忙吗? –