我正在处理这样的字符串:
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模块不会将其排序。
我做错了什么? 看起来我在两种情况下都使用相同的数据,但有些不同。
答案 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
,那么它将用制表符代替它们。
值得在交互式解释器中使用它(请记住在执行此操作时保持repr
和str
表示直接!)直到获得它为止。