Работа с окончаниями строк Windows в Python - PullRequest
0 голосов
/ 27 апреля 2010

У меня есть XML-файл объемом 700 МБ, полученный от поставщика Windows.

Как и следовало ожидать, окончания строк - это '\ r \ n' (или ^ M в vi). Каков наиболее эффективный способ справиться с этой ситуацией, кроме как заставить поставщика отправить сообщение через \ n: -)

  1. Использование os.linesep
  2. Используйте rstrip () (требующий открытия файла ... что кажется сумасшедшим)
  3. Использование Универсальная поддержка новой строки не является стандартной для моего Mac Snow Leopard - поэтому не вариант.

Я открыт для всего, что требует Python 2.6+, но должно работать на Snow Leopard и Ubuntu 9.10 с минимальными внешними требованиями. Я не возражаю против небольшого снижения производительности, но я ищу стандартный лучший способ справиться с этим.

---- редактировать ----

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

Ответы [ 4 ]

6 голосов
/ 27 апреля 2010

Почему заканчиваются линии DOS? Большинство вещей могут справиться с ними просто отлично, включая парсеры XML. Если вы действительно хотите избавиться от них, откройте файл в режиме universal line-endings:

open(filename, 'rU')

Python преобразует все окончания строк в окончания UNIX. Если вы действительно не можете использовать это (что я нахожу немного удивительным), нет способа заставить Python выполнить эту работу за вас. Тем не менее, вам придется открыть файл независимо, поэтому ваше возражение против # 2 кажется немного странным.

2 голосов
/ 27 апреля 2010

Вы открываете файл в текстовом или двоичном режиме? Я почти уверен, что рассчитывал на универсальные переводы строк при установке Leopard, но, возможно, я тоже получил обновленный Python ...

В любом случае, я видел, как такого рода вещи кусают многих программистов, потому что они просто тянутся к клавише 'b'. Используйте «t», если вы открываете текстовые файлы, о которых известно, что они созданы на вашей платформе, «U» вместо «t», если вам нужны универсальные символы новой строки.

with file(filename, 'rt') as f:
   content = f.read()

Редактировать: В комментариях отмечено, что по умолчанию используется «rt». Справедливо, но стиль Python предпочитает явное, а не неявное, так что я с этим согласен.

1 голос
/ 27 апреля 2010

Предположительно: "" "У этого парня \ r \ n прямо в середине дескрипторов тегов, например: <ParentRedirec tSequenceID>" "".

Я не вижу здесь \r\n. Возможно, вы имеете в виду, что repr (xml) содержит такие вещи, как

"<ParentRedirec\r\ntSequenceID>"

Если нет, попробуйте сказать точно что вы имеете в виду с помощью repr-fashion examples .

Должно работать следующее:

>>> import re
>>> guff = """<atag>\r\n<bt\r\nag c="2">"""
>>> re.sub(r"(<[^>]*)\r\n([^>]*>)", r"\1\2", guff)
'<atag>\r\n<btag c="2">'
>>>

Если в теге более одного разрыва строки, например, <foo\r\nbar\r\nzot> это исправит только первое. Альтернативы (1) циклически изменяются до тех пор, пока не прекратится сжатие (2) сами напишите более умное регулярное выражение: -)

0 голосов
/ 27 апреля 2010

Что вы пытаетесь сделать с этим файлом?Пробелы между тегами обычно игнорируются в XML, поэтому единственное место, где окончания строк имеют значение для содержимого тегов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...