用Python处理Windows行尾

2024-05-06 17:18:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

  1. 使用os.linesep
  2. 使用rstrip()(要求打开文件。。。看起来很疯狂)
  3. 在我的Mac雪豹上使用Universal newline support不是标准的,所以不是一个选项。

我对任何需要Python2.6+的东西都是开放的,但是它需要在SnowLeopard和Ubuntu9.10上使用最小的外部需求。我不介意一个小的点球,但我正在寻找标准的最佳方式来处理这个问题。

----编辑----

行尾位于标记描述符的中间,否则就不会有问题。我知道这是不好的形式,他们不应该发送给我,但这是我如何有文件和供应商大多是不称职的。


Tags: 文件方法标准oswindowsmac情况xml
3条回答

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

open(filename, 'rU')

Python将把所有行尾转换为UNIX行尾。如果你真的不能使用它(我觉得有点奇怪),那就没有办法让Python为你做这项工作。不过,你无论如何都要打开文件,所以你对#2的反对似乎有点奇怪。

据称:“这家伙在标记描述符中间有一个像这样的<ParentRedirec tSequenceID>”“。”。

我看不到这里。也许您的意思是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)循环直到废话停止收缩(2)自己编写一个更聪明的regexp:-)

您是以文本模式还是二进制模式打开文件?我很确定我的Leopard安装中已经使用了通用的换行程序,但是也许我也从某个地方得到了一个更新的Python。。。

不管怎样,我见过这样的事情让很多程序员很苦恼,因为他们只是想得到“b”键。如果要打开已知在平台上创建的文本文件,请使用“t”,如果需要通用换行符,请使用“U”而不是“t”。

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

编辑:注释说明“rt”是默认值。说得对,但是Python风格倾向于显式而不是隐式,所以我要这么做。

相关问题 更多 >