python语言type board_Python脚本中NSPasteboard输出中的额外字符

本文探讨了在Python中使用NSPasteboard时遇到的额外字符问题,包括“u”前缀和引号。分析了可能的原因,如代码中的repr()函数使用,以及如何正确地从NSPasteboard获取字符串。建议使用pb.stringForType_(best_type[0])代替availableTypeFromArray_,并提醒注意Python2.x与Python3.x中字符串处理的差异。
摘要由CSDN通过智能技术生成

如果您对NSPasteboard一无所知,您应该浏览一下Pasteboard Programming Guide,并查看{a2}以了解详细信息。在

您给我们的代码不可能是您正在运行的代码,因为:pbstring = pb.stringForType_(NSString *)dataType

这不是有效的Python。它在ObjC和Python之间的某个地方。所以它只会引发一个SyntaxError。即使我把它变成合理的:

^{pr2}$

或者,如果你想明确地说:pbstring = pb.stringForType_(NSString.stringWithString_(dataType))

这将只是一个NameError,因为您还没有在任何地方定义dataType。在

那么,你从哪里得到dataType?对stringForType:的引用非常清楚:You must send types or availableTypeFromArray: before invoking stringForType:.

那么,如果我们调用pb.types()呢?我们得到一个字符串列表,类似于:Out[153]:

(

"NeXT smart paste pasteboard type",

"com.apple.webarchive",

"NeXT Rich Text Format v1.0 pasteboard type",

"public.utf8-plain-text",

NSStringPboardType,

)

一些内置类型不会以字符串文字形式返回,比如来自AppKit import*, or similar, you can just refer to it asNSStringPboardType. If you've done来自AppKit import*,来自Cocoa import*, or similar, you can just refer to it asNSStringPboardType`。在

总之,选择一些看起来合理的东西并使用它:In [156]: pb.stringForType_(NSStringPboardType)

Out[156]: u'some text'

一切都很好!在

那么,为什么你得到"u'some text'"而不是{}?我的猜测是,在实际代码中,setClip或{}在某处执行额外的repr(s)。例如:In [165]: s=u'some text'

In [166]: repr(s)

Out[166]: "u'some text'"

In [167]: s

Out[167]: u'some text'

Out[166]你可能很熟悉。最有可能的是,您已经在代码中完成了相同的操作。但既然你没有在你展示给我们的代码中做到这一点,我们就无法猜测它在哪里。在

编写getClip()的正确方法是按照您的优先顺序生成一个list类型,然后执行如下操作:def getClip():

pb = NSPasteboard.generalPasteboard()

best_type = pb.availableTypeFromArray_(myFavoriteTypes)

if best_type:

return pb.stringForType_(best_type)

这看起来很痛苦,而且没有必要。你就不能做return pb.stringForType_(best_type[0])而跳过那些availableTypeFromArray_的废话吗?实际上,如果你想要的类型是NSStringPboardType,那么到目前为止,在OSX的每一个版本中,可能在宇宙中的每一个程序中,你都可以摆脱它,因为把文本放在剪贴板上而不以那种格式提供是没有意义的。但这仍然是错误的,而且是个坏习惯。(此外,也许您更喜欢使用UTF-8字节而不是Unicode字符串,这在python2.x中更容易处理,或者在3.3中更有效)

当你在控制台上看到{cd23>时,你会看到{cd17>而不是^在控制台上但是,你说,“还有一个‘u’和一对引号,即使已经没有两对引号了,它还是坏了!”不,不是的。看看这个:In [182]: s=u'some text'

In [183]: s

Out[183]: u'some text'

In [184]: print s

some text

或者这个:In [185]: s='some text'

In [186]: s

Out[186]: 'some text'

In [187]: print s

some text

只要您在交互控制台中键入字符串(或返回字符串的函数),它就会打印出带有引号的字符串。但是当您显式使用print语句时,可以看到,引号实际上并不在字符串中。在

所以,如果你看到这个:In [332]: getClip()

Out[332]: u"some text"

这实际上是正确的。它与上面的s=u'some text'示例相同。字符串中没有引号或u字符;这只是交互式解释器显示您在命令行键入的字符串的方式。要验证它,只需print结果:In [332]: print getClip()

some text

或将其存储在文件中:In [188]: with open('test.txt', 'w') as f:

.....: f.write(getClip())

.....:

现在在文本编辑器中打开test.txt,没有引号,没有u。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值