【问题标题】:Dealing with Windows line-endings in Python在 Python 中处理 Windows 行尾
【发布时间】:2010-04-26 21:37:51
【问题描述】:

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

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

  1. 使用os.linesep
  2. 使用rstrip()(需要打开文件……这似乎很疯狂)
  3. 在我的 Mac Snow Leopard 上使用 Universal newline support 不是标准 - 所以不是一个选项。

我对任何需要 Python 2.6+ 的东西都持开放态度,但它需要在 Snow Leopard 和 Ubuntu 9.10 上运行,并且外部要求最低。我不介意小的性能损失,但我正在寻找标准的最佳方法来处理这个问题。

----编辑----

行尾位于标签描述符的中间,否则不会有这样的问题。我知道这是不好的形式,他们不应该把它发给我,但这是我拥有文件的方式,而供应商大多不称职。

【问题讨论】:

  • 那么你怎么知道是否需要空格呢?你当然不能只是去删除所有的空白。例如。考虑到这个问题,你会如何折叠<xxx yyy zzz>

标签: python file


【解决方案1】:

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

open(filename, 'rU')

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

【讨论】:

  • 呵呵,只是(重新)阅读文档-永远不知道 U 是“必需的”来打开通用换行符支持...我的大部分工作都在 Windows 上,而 unix 换行符是(谢天谢地)优雅地处理......
  • Windows 上的文本模式读取(MS C 运行时将为您转换行尾)与 Python 的通用行尾支持不同。通用行尾在所有操作系统上都是相同的。 Windows 文本模式是特定于 Windows 的(并且还会影响其他事物,例如导致过早 EOF 的 EOF 字符。)
  • 通用新行不适用于我的系统。
【解决方案2】:

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

无论如何-我见过这种事情让许多程序员陷入困境,因为他们只是伸手去拿'b'键。如果您要打开已知在您的平台上创建的文本文件,请使用“t”,如果您需要通用换行符,请使用“U”而不是“t”。

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

编辑: cmets 注意到 'rt' 是默认值。公平点,但是 Python 风格倾向于显式而不是隐式,所以我会这样做。

【讨论】:

  • 最接近确定的答案。我现在意识到我需要一个更好的文件。
  • 这是我第一次听说't' 不是所有地方的默认模式。你能详细说明一下吗? 'rt''r' 真的不一样吗?默认真的是'b',还是有第三种模式?
  • 发布后我查看了文档。根据我所看到的,我怀疑“t”是默认值,但我觉得显式优于隐式。 :) 无论如何-我也看到很多人默认情况下只是在其中添加一个“b”,即使在处理文本文件时也是如此。头脑难以置信,但这是发生的事情,所以我问。 ;)
  • 托马斯太温柔了。 'rt' 与 't' 相同。
  • @dash-tom-bang: s/可能有点错误/绝对错误/ ...帮自己一个忙,删除你的答案。
【解决方案3】:

据称:“”“这家伙在标签描述符的中间有 \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">'
>>>

如果标签中有多个换行符,例如&lt;foo\r\nbar\r\nzot&gt; 这只会修复第一个。替代方案 (1) 循环直到 guff 停止缩小 (2) 自己编写一个更智能的正则表达式 :-)

【讨论】:

  • 你是对的,评论系统去掉了换行符,标签就像:“
【解决方案4】:

你想用这个文件做什么?标签之间的空格通常在 XML 中被忽略,因此行尾的唯一位置与标签的内容有关。

【讨论】:

  • 这家伙 \r\n 就在标签描述符的中间,如下所示: 我更希望他们最终修复它,但我有点着急,只是想剥离这些东西。
  • 如果是这种情况,无论如何它都会被破坏 - 一个 \n 而不是 \r\n 不会有什么不同。
  • 我正在考虑删除所有类型的换行符,但现在我意识到它不会起作用,因为某些块具有有效的换行符,它们是实际数据的一部分。
猜你喜欢
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
相关资源
最近更新 更多