Python;如何用它们各自的'真实'utf-8替换转义的非Unicode字符?

3
我是一个相对新手,正在学习编程。我尝试在Ubuntu(Linux)上编写Spotify的Snip的Python等效程序,但遇到了一些问题。我可以正确地编码标题,但无法以同样的方式编码艺术家信息。
当我尝试以同样的方式编码艺术家信息时,出现以下错误:
File "./songfinder.py", line 11, in currentplaying
    artiststr = str((metadata['xesam:artist']).encode('utf-8'))
AttributeError: 'dbus.Array' object has no attribute 'encode'

然而,标题的处理方式完全相同且有效。

迄今为止的代码是有效的,但例如会出现\xd8而非Ø等类似情况:

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

相关问题和答案:

如何在Python中替换Unicode字符串中的非ASCII字符

为什么它不能解决我的问题: 我想打印/保存实际的字符,而不是用类似的字符替换它


Python版本:2.7.11 - Bjornolil
3个回答

0

你得到的错误与Unicode无关,而是类型错误。Python抱怨你试图从数组对象调用字符串方法encode,而该对象没有此方法。

首先,我会尝试删除多余的括号,使其像这样获取artiststr:artiststr = str(metadata['xesam:artist'])

但我不确定这是否有效。如果无法解决问题,你需要找出metadata['xesam:artist']的类型。看起来它不是字符串,而是数组。因此,你需要修复填充数据到metadata['xesam:artist']的代码。可以尝试使用调试器或print()函数来查找metadata['xesam:artist']的内容。或者在你的问题中提供相关代码。


感谢您的帮助,有了您提供的信息,我能够进行简单的重新编码以使其正常工作。非常感谢您。最终解决方案: artiststr = str((metadata['xesam:artist'])[0].encode('utf-8')) - Bjornolil
没问题。 :) 是的,它可以工作,但你应该确保数据集中不会有多个项目。 - Paul

0

最终程序,如果你喜欢可以随意使用:

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)

0

看了你的问题,metadata 至少包含类似于 Unicode 字符串的内容。艺术家字段似乎是某种以艺术家为开头的可迭代对象。类似于这样(可以随意发布实际的元数据内容):

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

在标题赋值行中,由于编码Unicode字符串会返回一个“str”,因此“str”是不必要的,但也无需对其进行编码。 Unicode字符串表示文本,因此保持原样即可:
title =  metadata['xesam:title']

对于artist的赋值,同样获取可迭代对象的第一个元素:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接