2016-09-11 7 views
3

私は比較的新しいプログラミングです。私は小さな問題を持っています。ubuntu(Linux)のためにSnipに相当するPythonを書いていますどういうわけか、正しくタイトル、しかし、私はこの取得同じやり方でアーティストをエンコードしようとしたときと同じようPython;どのようにエスケープされた非ユニコード文字をそれぞれの '実際の' utf-8と置き換えるのですか?

アーティストをエンコードすることができません:タイトルはまったく同じに行われていることさが

File "./songfinder.py", line 11, in currentplaying 
    artiststr = str((metadata['xesam:artist']).encode('utf-8')) 
AttributeError: 'dbus.Array' object has no attribute 'encode' 

をは働いている。

コードは、これまでの作業が、例えば、\の代わりにØのxd8、および類似持っています:それは私の問題を解決しないのはなぜ Replace non-ascii chars from a unicode string in Python

import dbus 
session_bus = dbus.SessionBus() 
spotify_bus = session_bus.get_object("org.mpris.MediaPlayer2.spotify", "/org/mpris/MediaPlayer2") 
spotify_properties = dbus.Interface(spotify_bus, "org.freedesktop.DBus.Properties") 

def currentplaying(): 
    metadata = spotify_properties.Get("org.mpris.MediaPlayer2.Player", "Metadata") 
    title = str((metadata['xesam:title']).encode('utf-8')) 
    artiststr = str((metadata['xesam:artist'])) 
    if ("dbus.string" in artiststr.lower()): 
     artists = artiststr.split("(u") 
     artist = artists[1] 
     artists = artist.split(")],") 
     artist = artists[0] 
     artist = artist.replace("(u", "") 
    else: 
     artist = "'unknown'" 

    artist = (artist.replace("'","")) 

    playing = (artist + " - " + title + "    ") 
    return playing 

#save playing to file.txt 

関連QNAさんを私はしたいと思います実際の文字を印刷して保存します。類似の文字で置き換えません。

+0

Pythonのバージョン:ヘルプのための2.7.11 – Bjornolil

答えて

0

は、Unicode文字列を使用してこのような少なくとも何かが含まれています。アーティストのフィールドは、アーティストとの始まりの何らかの反復可能性のようです。この(実際のメタデータコンテンツを投稿すること自由に感じ)のようなもの:title割り当て行で

metadata = {'xesam:title':u'title','xesam:artist':[u'artist']} 

、Unicode文字列をエンコードするため、strは不要ですが、とにかくstrを返しませんが、どちらかそれをエンコードする必要。 Unicode文字列はテキストを表すので、そのようにそれを残す:

artist割り当てのために同様の
title = metadata['xesam:title'] 

が、反復可能なの最初の要素を取得:

artist = metadata['xesam:artist'][0] 

次へ]を、あなたの歌更新ロジックで、io.openを使用UTF-8エンコーディングでファイルを開きます。これにより、Unicode文字列(テキスト)を直接書き込むことができ、ファイルがエンコーディングを処理します。また、withステートメントを使用して、withが終了すると自動的にファイルを閉じます。推奨の変更と

プログラム:

import time 
import dbus 
import io 
session_bus = dbus.SessionBus() 
spotify_bus = session_bus.get_object("org.mpris.MediaPlayer2.spotify", "/org/mpris/MediaPlayer2") 
spotify_properties = dbus.Interface(spotify_bus, "org.freedesktop.DBus.Properties") 

def currentplaying(): 
    metadata = spotify_properties.Get("org.mpris.MediaPlayer2.Player", "Metadata") 
    title = metadata['xesam:title'] 
    artist = metadata['xesam:artist'][0] 
    playing = artist + " - " + title + "    " 
    return playing 

while True: 
    with io.open('currentsongspotify.txt', encoding='utf8') as filetxt: 
     oldtitle = filetxt.read() 
    newtitle = currentplaying() 
    if newtitle == oldtitle: 
     time.sleep(1) 
    else: 
     with io.open('currentsongspotify.txt','w',encoding='utf8') as filetxt: # save newtitle to file, overwriting existing data 
      filetxt.write(newtitle) 
     print 'new file saved:',newtitle 
0

エラーはユニコードではなく、間違ったタイプです。 Pythonは、配列オブジェクトから文字列メソッドencodeを呼び出そうとしていると訴えています。この方法はありません。

私が最初に試してみたいのは、ここで余分な角括弧を削除することです。これはartiststrのようになります:artiststr = str(metadata['xesam:artist'])

しかし、これはうまくいくとは思えません。うまくいかない場合は、メタデータ['xesam:artist']がどのタイプに含まれているかを調べる必要があります。それは文字列ではなく、配列のように見えます。したがって、metadata['xesam:artist']を埋め込むコードをデータで修正する必要があります。あなたはmetadata['xesam:artist']の内容を見つけるために、デバッガを使用するか、またはちょうどprint()関数を使ってみることができます。または、関連するコードをあなたにも提供してください。

+0

おかげで、私はそれが働いて得るために簡単な再符号化を行うことができたあなたの情報を。どうもありがとうございます。 最終解決策: artiststr = str(メタデータ['xesam:artist'])[0] .encode( 'utf-8')) – Bjornolil

+0

問題はありません。 :)はい、それは動作しますが、そのデータセット以上の項目がないことを確認する必要があります。 – Paul

0

最終的なプログラム、あなたが好きな場合は、使用して自由に感じる:あなたの質問metadataを見てみると

import time 
import dbus 
session_bus = dbus.SessionBus() 
spotify_bus = session_bus.get_object("org.mpris.MediaPlayer2.spotify", "/org/mpris/MediaPlayer2") 
spotify_properties = dbus.Interface(spotify_bus, "org.freedesktop.DBus.Properties") 


def currentplaying(): 
    metadata = spotify_properties.Get("org.mpris.MediaPlayer2.Player", "Metadata") 
    title = str((metadata['xesam:title']).encode('utf-8')) 
    artiststr = str((metadata['xesam:artist'])[0].encode('utf-8')) 

    artist = artiststr 



    playing = (artist + " - " + title + "    ") 
    return playing 

while True: 

    filetxt = open("/home/USER/Desktop/currentsongspotify.txt", "r") 
    oldtitle = filetxt.read() 
    filetxt.close() 

    newtitle = str(currentplaying()) 


    if(newtitle == oldtitle): 
     time.sleep(1) 
    else: 
     filetxt = open("/home/USER/Desktop/currentsongspotify.txt", "w") #save newtitle to file, overwriting existing data 
     filetxt.write(str(newtitle)) 
     print("new file saved: " + newtitle) 
関連する問題