2015-03-26 1 views
3

Используя Python 2.7.9, я пытаюсь взять список каталогов в стиле DOS и разделить его на отдельные строки, используя встроенную функцию разделения строк. Список является каталогом, и одна из строк в моей тройной кавычки содержит конечную обратную косую черту. Проблема заключается в том, что линия заканчивается обратной косой черты не является раскол:Разделительные линии Python 2.7 не могут разбиваться на обратную косую черту назад

# DOS-style listing of the directory "B:\" 
listing = """Directory of B:\ 
      12/15/2014 02:12 PM    1814814 BIRD.LOG 
      01/01/2000 12:04 AM <DIR>   CONFIG 
      12/15/2014 02:55 PM    35060 ALLIGATOR.LOG 
      03/15/2013 02:06 PM <DIR>   MONKEY 
      03/15/2013 02:06 PM <DIR>   FROG 
      03/15/2013 02:06 PM <DIR>   BADGER 
       2 File(s) 1849874 bytes 
       4 Dir(s)  1674739712 bytes free 
""" 

# BIRD.LOG is combined with prior line ending in a backslash 
print "keepends = False" 
for line in listing.splitlines(False): print repr(line) 

# Setting keepends=True does not help 
print "keepends = True" 
for line in listing.splitlines(True): print repr(line) 

Вот результат:

keepends = False 
'Directory of B:   12/15/2014 02:12 PM    1814814 BIRD.LOG' 
'   01/01/2000 12:04 AM <DIR>   CONFIG' 
'   12/15/2014 02:55 PM    35060 ALLIGATOR.LOG' 
'   03/15/2013 02:06 PM <DIR>   MONKEY' 
'   03/15/2013 02:06 PM <DIR>   FROG' 
'   03/15/2013 02:06 PM <DIR>   BADGER' 
'    2 File(s) 1849874 bytes' 
'    4 Dir(s)  1674739712 bytes free' 
keepends = True 
'Directory of B:   12/15/2014 02:12 PM    1814814 BIRD.LOG\n' 
'   01/01/2000 12:04 AM <DIR>   CONFIG\n' 
'   12/15/2014 02:55 PM    35060 ALLIGATOR.LOG\n' 
'   03/15/2013 02:06 PM <DIR>   MONKEY\n' 
'   03/15/2013 02:06 PM <DIR>   FROG\n' 
'   03/15/2013 02:06 PM <DIR>   BADGER\n' 
'    2 File(s) 1849874 bytes\n' 
'    4 Dir(s)  1674739712 bytes free\n' 

проблема неизменна прохождения keepends = True. В Python splitlines documentation не упоминается какая-либо специальная обратная косая черта, и ни одна из документации для universal newlines approach не разделяет линии разделения.

Мой образец кода - это единичный тест, но в реальном мире листинг будет программно получен. Я могу думать об обходных решениях, связанных с манипулированием моим входным списком или другими методами, но мне интересно, почему обходной путь должен быть необходим вообще. Это ошибка? Любые советы, безусловно, будут оценены!

ответ

4

Проблема с вашим модульным тестом заключается в том, что символ \ в строковом литерале интерпретируется как escape-символ Python. Попробуйте изменить первую строку на

listing = r"""Directory of B:\ 

Из Python docs:

строковые литералы могут необязательно иметь префикс с буквой «R» или «R»; такие строки называются необработанными строками и используют разные правила для интерпретации escape-последовательностей обратного слэша.

В реальном сценарии работы, где вы получаете строку из выходного файла команды, это не должно быть проблемой.

+0

Моя проблема заключалась в том, что я соединял необработанные строки с тройными цитируемыми строками. Назначение необработанных строк состоит в том, чтобы упростить ввод символов обратной косой черты, в то время как цель тройного цитирования состоит в том, чтобы упростить ввод кавычек и строк новой строки. Они являются отдельными функциями, и в ответе оба используются. –

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