2015-04-09 3 views
3

У меня есть файл конфигурации, который имеет строку, разделенную на вкладку. Я хочу получить эту строку, а затем преобразовать ее в хороший список. Но я вижу некоторые интересные вещи, которые я не вижу, когда делаю это непосредственно на iPython.Python strip строка из файла конфигурации

[myvars] 
myString = "a\tb\tc\td" 
..... 
.....<many more variables> 

Мой Python код имеет это:

param_dict = dict(config.items(myvars)) 
str1 = param_dict["myString"] 
print str1 
print str1.split() 

И он печатает это:

"a\tb\tc\td" 
['"a\\tb\\tc\\td"'] 

Но, когда я делаю то же самое на моем питона консоли, я получаю то, что я Ожидайте:

Python 2.7.6 (default, Mar 22 2014, 22:59:38) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> "a\tb\tc\td".split() 
['a', 'b', 'c', 'd'] 
>>> k = "a\tb\tc\td" 
>>> k.split() 
['a', 'b', 'c', 'd'] 

Что происходит? повторно? Кто-нибудь может мне помочь? Я не могу изменить формат переменных файла конфигурации. И я хочу, чтобы переменная вышла и разделилась на хороший список.

Спасибо.

+0

Я предполагаю, что '\ t'is только вкладки, когда вы читаете его из командной строки, а не когда ты прочитайте его из ini-файла. Вот почему вы получаете двойные слэши в своей переменной. – 576i

ответ

6

Обратная косая черта читается здесь, вы не видите этого, когда печатаете обычную строку, но делаете, если вы печатаете репрезентацию.

In [11]: myString = "a\\tb\\tc\\td" 

In [12]: print(myString) 
a\tb\tc\td 

In [13]: print(repr(myString)) 
'a\\tb\\tc\\td' 

Вы можете использовать расшифровывает для преобразования \\t в \t:

In [14]: myString.decode('string_escape') 
Out[14]: 'a\tb\tc\td' 

После того, как они Вкладки можно разделить на них:

In [15]: myString.split() 
Out[15]: ['a\\tb\\tc\\td'] 

In [16]: myString.decode('string_escape').split() 
Out[16]: ['a', 'b', 'c', 'd'] 
3

Это происходит потому, что в вашей "сценарий" вас у вас нет "a\tb\tc\td" у вас действительно есть "a\\tb\\tc\\td", но если вы сделаете отпечаток "a\\tb\\tc\\td", он выведет "a\tb\tc\td"

print myString 
Output: 'a\tb\tc\td' 
print repr(myString) 
Output: 'a\\tb\\tc\\td' 

Вы можете пользователем функция decode преобразовать строку из 'a\\tb\\tc\\td' в 'a\tb\tc\td', а затем разделить или все, что нужно

import re 
myString = "a\\tb\\tc\\td" 

# I prefer to use regular expressions to deal with strings: 
myString = re.sub(r'\W','', myString.decode('string_escape')) 
print myString 
Output: 'abcd' 

# Or you can use split also 
myString = myString.decode('string_escape').split() 
print myString 
Output: ['a', 'b', 'c', 'd'] 
+0

Andy, Cym и Liarez: Все ваши решения хороши. Не удалось продвинуть все ... – user1717931

3

Из того, что я вижу, вы ошибочно думаете, что ваша строка вкладка разделенный в вашем файле, где он разделяется двумя символами «\» и «t», которые представляют собой вкладку. Это показано представлением со сбрасываемыми обратными косыми чертами: «a \\ tb» вместо «a \ tb»

Поскольку символ пробела отсутствует, сортировка не знает, как разбить строку.

Вы позволяющее задать другой разделитель в Сплите, здесь два символа \ т:

str1.split("\\t") 
Смежные вопросы