2016-11-11 4 views
0

Ich habe Playlists in ein Verzeichnis, basierend auf ihrer Größe hochgeladen.Python - ersetzen vs Update-Datei

erste lade ich die folgende dict in ein leeres Verzeichnis:

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}} 

dann diese:

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}} 

das ist, wie ich Wiedergabelisten Verzeichnis laden, immer wieder:

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) 

So lade ich die erste, playlist_pre, in eine leere di Pfarrhaus.

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 werden genannt:

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

dieser Ausgang gewünscht wird, wenn playlist_pre nach playlist_pos erzeugt wird: eine neue Datei vor und nach dem Verbinden Wiedergabelisten;

wiederholt Spuren haben eine incremented value und neue Tracks haben 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

Es scheint mir, dass Sie immer laden 'db = json.load (f)' und das zeigt immer auf 'user1.json'. – sal

+0

Wie kann ich das beheben? –

+0

Auf die Anweisungen 'db = playlist2' und' db = playslist1' folgt das gleiche 'db = json.load (f)': warum überschreibst du die Variable? – sal

Antwort

0

mir scheint, dass die db Variable versehentlich überschrieben wird, und so lädt immer Daten von db/user1.json. Die schnelle Lösung wäre, die db = json.load(f) Anweisung in beiden Zweigen auskommentieren: Schließlich möchten Sie den Dateiinhalt vollständig neu schreiben.

Ich würde allerdings auch die beiden Codeblocks als Funktionen implementieren, da sie genau die gleiche Logik wiederholen, und das macht es besser lesbar und leichter zu debuggen:

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 eher wie eine Sucht Problem mit Verschmelzung die zwei Wiedergabelisten, pre/pos. Dafür benötigt der updateTrackCounts Anpassungen. Da die new Playlist mehr Daten als die old enthalten wird, würde eine Möglichkeit updateTrackCounts beiden Wiedergabelisten zu füttern, und es in-place die neuen, auf Basis vorhanden aktualisiert auf den Spuren des alten:

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 

zum Beispiel von der Verwendung, nach dem Aufruf:

updateTrackCounts(playlist_pos, playlist_pre, value=1.0) 

playlist_pos wird gleich wie joined_playlist

Dies könnte adj brauchen basierend auf Ihrem Ziel: zum Beispiel, berücksichtigt dies nicht den Fall, wenn die alten und neuen die gleichen sind wie keine Änderung passiert ist.

+0

Ich bekomme eine neue Playliste mit inkrementiertem Wert in Ordnung, aber inkrementierte Werte machen nur für vorher vorhandene Tracks Sinn. Ich habe einen Edit gepostet, um die gewünschte Ausgabe zu verdeutlichen: neue Tracks mit Default-Wert = 1.0 und wiederholte Tracks mit inkrementiertem Wert. Kannst du bitte noch helfen? –