2013-03-29 2 views
1

Я обработка строки, как это:Python: как обрабатывать вставляемый текст из буфера обмена?

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» отсортирован красиво в «рамке» The переменных «XCO» и «МКО»

Теперь, если я это сделать:

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

Вы уверены, что ваш буфер обмена имеет символы табуляции, а не буквальные обратные косые черты, а затем 't's? (Например, если вы копируете и вставляете строку из первой строки исходного кода, вы получите обратную косую черту и 't' s, а не вкладки.) – abarnert

ответ

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 кодека описан в списке Standard Encodings в codecs модуле. Он определяется как:

Производят строку, которая подходит в качестве Unicode буквальным в исходном коде Python

Другими словами, если вы encode с этим кодеком, он заменит каждый Непечатаемый символ Unicode с escape-последовательность, которую вы можете ввести в свой исходный код. Если у вас есть символ табуляции, он заменит его символом обратной косой черты и t.

Вы хотите сделать точную обратную ссылку: у вас есть строка, которую вы скопировали из исходного кода, с escape-последовательностями в стиле исходного кода, и вы хотите интерпретировать ее так же, как это делает интерпретатор Python. Итак, вы просто decode с тем же кодеком. Если у вас есть обратная косая черта, за которой следует t, она заменит их символом табуляции.

Стоит поиграть с этим в интерактивном интерпретаторе (не забудьте сохранить изображения repr и str прямо, делая это!), Пока вы его не получите.

+0

Это ответ: scrpt = codecs.decode (scrpt, 'unicode_escape «). Не могли бы вы кратко объяснить, почему это работает? Является ли он заменой «\ t» на вкладки? – terrachild

+0

Я новичок в «Переполнение стека». Предполагаем ли мы отмечать вопросы, «разрешенные», как на других форумах? – terrachild

+0

@terrachild: Вы ничего не делаете для _question_; вы нажмете галочку, чтобы принять одно из _answers_. – abarnert

Смежные вопросы