Python:如何处理剪贴板中的粘贴文本?

时间:2013-03-29 22:25:32

标签: python string

我正在处理这样的字符串:

    scrpt = "\tFrame\tX pixels\tY pixels\r\n\t2\t615.5\t334.5\r\n\t3\t615.885\t334.136\r\n\t4\t615.937\t334.087\r\n\t5\t615.917\t334.106\r\n\t6\t615.892\t334.129\r\n\t7\t615.905\t334.117\r\n\t8\t615.767\t334.246\r\n\t9\t615.546\t334.456\r\n\t10\t615.352\t334.643\r\n\r\n"

    infile = StringIO(scrpt)
    #pretend infile was just a regular file...

    r = csv.DictReader(infile, dialect=csv.Sniffer().sniff(infile.read(1000)))
    infile.seek(0)

    Frame, Xco, Yco = [],[],[]
    for row in r:
        Frame.append(row['Frame'])
        Xco.append(row['X pixels'])
        Yco.append(row['Y pixels'])

这很好用。我将字符串变量'scrpt'很好地排序到变量'Frame','Xco'和'Yco'

现在,如果我这样做:

print(scrpt)

我看到整齐排列在标签栏中的东西如下:

Frame   X pixels    Y pixels

2   615.5   334.5
3   615.885 334.136
4   615.937 334.087
5   615.917 334.106
6   615.892 334.129
7   615.905 334.117
8   615.767 334.246
9   615.546 334.456
10  615.352 334.643

但是,如果我从剪贴板粘贴了相同的字符串并尝试处理它,则它不起作用。 在这种情况下,如果我这样打印:

print(scrpt)

我明白了:

\tFrame\tX pixels\tY pixels\r\n\t2\t615.5\t334.5\r\n\t3\t615.885\t334.136\r\n\t4\t615.937\t334.087\r\n\t5\t615.917\t334.106\r\n\t6\t615.892\t334.129\r\n\t7\t615.905\t334.117\r\n\t8\t615.767\t334.246\r\n\t9\t615.546\t334.456\r\n\t10\t615.352\t334.643\r\n\r\n

然后,当我去处理它时,csv模块不会将其排序。

我做错了什么? 看起来我在两种情况下都使用相同的数据,但有些不同。

1 个答案:

答案 0 :(得分:0)

我的猜测是你的剪贴板有字面反斜杠和t字符,而不是制表符。例如,如果您只是从源的第一行复制,那就是您将获得的。

换句话说,就好像你这样做了:

scrpt = r"\tFrame\tX pixels\tY pixels\r\n\t2\t615.5\t334.5\r\n\t3\t615.885\t334.136\r\n\t4\t615.937\t334.087\r\n\t5\t615.917\t334.106\r\n\t6\t615.892\t334.129\r\n\t7\t615.905\t334.117\r\n\t8\t615.767\t334.246\r\n\t9\t615.546\t334.456\r\n\t10\t615.352\t334.643\r\n\r\n"

......或等同于:

scrpt = "\\tFrame\\tX pixels\\tY pixels\\r\\n\\t2\\t615.5\\t334.5\\r\\n\\t3\\t615.885\\t334.136\\r\\n\\t4\\t615.937\\t334.087\\r\\n\\t5\\t615.917\\t334.106\\r\\n\\t6\\t615.892\\t334.129\\r\\n\\t7\\t615.905\\t334.117\\r\\n\\t8\\t615.767\\t334.246\\r\\n\\t9\\t615.546\\t334.456\\r\\n\\t10\\t615.352\\t334.643\\r\\n\\r\\n"

如果这是问题,修复非常简单:

scrpt = scrpt.decode('string_escape')

或者,在3.x中(您无法在decode上拨打str):

script = codecs.decode(script, 'unicode_escape')

unicode_escape编解码器在codecs模块的Standard Encodings列表中进行了描述。它被定义为:

  

在Python源代码中生成一个适合作为Unicode文字的字符串

换句话说,如果您使用此编解码器encode,它将使用您可以在源代码中键入的转义序列替换每个非打印Unicode字符。如果你有一个制表符,它将用反斜杠字符和t替换它。

你想要完全相反:你有一个你从源代码复制的字符串,带有源代码风格的转义序列,你想要像Python解释器那样解释它。所以,你只需decode使用相同的编解码器。如果你有一个反斜杠后跟一个t,那么它将用制表符代替它们。

值得在交互式解释器中使用它(请记住在执行此操作时保持reprstr表示直接!)直到获得它为止。