首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中NSPasteboard输出中的额外字符

Python中NSPasteboard输出中的额外字符
EN

Stack Overflow用户
提问于 2013-01-04 21:40:51
回答 1查看 551关注 0票数 1

我的第一篇文章…

我正在使用python脚本从Mac上的剪贴板获取文本。

我使用以下函数设置剪贴板:

代码语言:javascript
复制
def setClip (text):
    pb = NSPasteboard.generalPasteboard()
    pb.clearContents()
    a = NSArray.arrayWithObject_(text)
    return pb.writeObjects_(a)

其中text =“一些文本”

我使用以下内容检索剪贴板:

代码语言:javascript
复制
def getClip():
    pb = NSPasteboard.generalPasteboard()
    pbstring = pb.stringForType_(NSString *)dataType
    return pbstring

输出以"u“开头,文本以引号括起来,如下所示:

代码语言:javascript
复制
In [224]: setClip('some text')
Out[224]: True

In [225]: getClip()
Out[225]: "u'some text'"

我如何检索文本,因为它应该是输入到剪贴板?

我对NSPasteboard一无所知。我在堆栈溢出上找到了这些代码片段。

提前谢谢。

增编:我的实际代码

代码语言:javascript
复制
    from AppKit import *
    def setClip (text):
        pb = NSPasteboard.generalPasteboard()
        pb.clearContents()
        a = NSArray.arrayWithObject_(text)
        return pb.writeObjects_(a)

    def getClip():
        pb = NSPasteboard.generalPasteboard()
        pbstring = pb.stringForType_(NSString *)dataType
        return pbstring

当我在ipython中运行它时,会发生这样的情况:

输出以"u“开头,文本以引号括起来,如下所示:

代码语言:javascript
复制
In [224]: setClip('some text')
Out[224]: True

In [225]: getClip()
Out[225]: "u'some text'"

answer*** 尝试了一个建议

代码语言:javascript
复制
def getClip():
    pb = NSPasteboard.generalPasteboard()
    return pb.stringForType_("public.utf8-plain-text")

In [332]: getClip()
Out[332]: u"some text"

不去。:-(

是。我只需要这样做:

代码语言:javascript
复制
print getClip()

我现在有

代码语言:javascript
复制
"some text"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-04 22:20:13

如果您对NSPasteboard一无所知,则应该浏览纸板程序设计指南,并查看NSPasteboard类引用以获得详细信息。

您给我们的代码不可能是您正在运行的代码,因为:

代码语言:javascript
复制
pbstring = pb.stringForType_(NSString *)dataType

这是无效的Python。它介于ObjC和Python之间。所以它只会引发一个SyntaxError。即使我把它变成理智的东西:

代码语言:javascript
复制
pbstring = pb.stringForType_(dataType)

或者,如果你想说得很清楚:

代码语言:javascript
复制
pbstring = pb.stringForType_(NSString.stringWithString_(dataType))

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

那么,你从哪里得到dataType呢?stringForType:的引用非常清楚地表明了这一点:

必须在调用availableTypeFromArray:之前发送类型或stringForType:。

那么,如果我们打电话给pb.types()呢?我们得到一个字符串列表,如下所示:

代码语言:javascript
复制
Out[153]: 
(
    "NeXT smart paste pasteboard type",
    "com.apple.webarchive",
    "NeXT Rich Text Format v1.0 pasteboard type",
    "public.utf8-plain-text",
    NSStringPboardType,
    …
)

一些内置类型不会以字符串形式返回,比如从Cocoa * u"public.utf8-plain-text", but as string constants from one of the Cocoa libraries, likeNSStringPboardType. If you've donefrom AppKit import *, *, or similar, you can just refer to it asNSStringPboardType`。

无论如何,选择一些看起来合理的东西,然后使用它:

代码语言:javascript
复制
In [156]: pb.stringForType_(NSStringPboardType)
Out[156]: u'some text'

百事大吉!

那么,为什么要使用"u'some text'"而不是u'some text'呢?我的猜测是,在您的实际代码中,setClipgetClip在某个地方做了一个额外的repr(s)。例如:

代码语言:javascript
复制
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,然后执行如下操作:

代码语言:javascript
复制
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,那么到目前为止,您可以使用OS的每个版本,可能是宇宙中的每个程序,因为将文本放在剪贴板上而不是以这种格式提供文本是没有意义的。但这仍然是错误的,也是一个坏习惯。(此外,您可能实际上更喜欢获得UTF-8字节,而不是Unicode字符串,后者在Python2.x中可能更容易处理,或者在3.3中更高效。)

当您做正确的事情时,如果您只是在控制台上键入getClip(),您将看到u'some text'而不是'u"some text"'。“但是等一下”,你说,“那里还有'u‘和一对引号,即使不再有两对引号了,所以它仍然是坏的!”不,不是的。看一看这个:

代码语言:javascript
复制
In [182]: s=u'some text'

In [183]: s
Out[183]: u'some text'

In [184]: print s
some text

或者这个:

代码语言:javascript
复制
In [185]: s='some text'

In [186]: s
Out[186]: 'some text'

In [187]: print s
some text

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

所以,如果你看到这个:

代码语言:javascript
复制
In [332]: getClip()
Out[332]: u"some text"

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

代码语言:javascript
复制
In [332]: print getClip()
some text

或者将其存储在文件中:

代码语言:javascript
复制
In [188]: with open('test.txt', 'w') as f:
   .....:     f.write(getClip())
   .....:

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14165442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档