在Python中处理Windows行结尾

时间:2010-04-26 21:37:52

标签: python file

我有一个来自Windows提供商的700MB XML文件。

正如人们所料,行结尾是'\ r \ n'(或vi中的^ M)。除了让供应商发送'\ n'之外,处理这种情况的最有效方法是什么: - )

  1. 使用os.linesep
  2. 使用rstrip()(要求打开文件......这看起来很疯狂)
  3. 在我的Mac Snow Leopard上使用Universal newline support不是标准配置 - 所以不能选择。
  4. 我对任何需要Python 2.6+的东西持开放态度,但它需要在最低外部要求的情况下使用Snow Leopard和Ubuntu 9.10。我不介意小的性能损失,但我正在寻找标准的最佳方法来解决这个问题。

    ---- ----编辑

    行结尾位于标记描述符的中间,否则它们不会是这样的问题。我知道这是一个糟糕的形式,他们不应该发送给我,但这就是我有文件的方式,供应商大多是无能的。

4 个答案:

答案 0 :(得分:6)

为什么DOS行结束有问题?大多数事情都可以很好地处理它们,包括XML解析器。如果您真的想摆脱它们,请在universal line-endings模式下打开文件:

open(filename, 'rU')

Python会将所有行结尾转换为UNIX行尾。如果你真的不能使用它(我觉得有点令人惊讶),那么就没有办法让Python为你做这项工作。不过,你必须打开文件,所以你对#2的反对似乎有些奇怪。

答案 1 :(得分:2)

您是以文本模式还是二进制模式打开文件?我很确定我在Leopard安装上依靠通用新行,但也许我从某个地方获得了更新的Python ......

无论如何 - 我已经看到这种事情咬住了许多程序员,因为他们只是为了'b'键。如果您打开已知在平台上创建的文本文件,请使用't',如果您需要通用换行符,请使用'U'而不是't'。

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

编辑:评论指出'rt'是默认值。公平的说法,但是Python风格往往更倾向于明确而非隐含,所以我就是这样。

答案 2 :(得分:1)

据说:“”“这个家伙正好在标签描述符的中间,如:<ParentRedirec tSequenceID>”“”。

我在这里看不到\r\n。也许你的意思是repr(xml)包含像

这样的东西
"<ParentRedirec\r\ntSequenceID>"

如果没有,请尝试使用repr-fashion 示例来说明正好你的意思。

以下内容应该有效:

>>> 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)循环直到guff停止收缩(2)自己写一个更聪明的正则表达式: - )

答案 3 :(得分:0)

你想用这个文件做什么? XML中通常会忽略标记之间的空格,因此唯一的行结尾对标记的内容很重要。