我有一个来自Windows提供商的700MB XML文件。
正如人们所料,行结尾是'\ r \ n'(或vi中的^ M)。除了让供应商发送'\ n'之外,处理这种情况的最有效方法是什么: - )
我对任何需要Python 2.6+的东西持开放态度,但它需要在最低外部要求的情况下使用Snow Leopard和Ubuntu 9.10。我不介意小的性能损失,但我正在寻找标准的最佳方法来解决这个问题。
---- ----编辑
行结尾位于标记描述符的中间,否则它们不会是这样的问题。我知道这是一个糟糕的形式,他们不应该发送给我,但这就是我有文件的方式,供应商大多是无能的。
答案 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中通常会忽略标记之间的空格,因此唯一的行结尾对标记的内容很重要。