Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中处理Windows行结尾_Python_File - Fatal编程技术网

在Python中处理Windows行结尾

在Python中处理Windows行结尾,python,file,Python,File,我有一个来自Windows提供商的700MB XML文件 正如人们所料,vi中的行尾是“\r\n”或^M。除了让供应商发送“\n”外,处理这种情况最有效的方法是什么:- 使用 使用打开文件。。。这似乎很疯狂 在我的Mac Snow Leopard上使用不是标准配置,因此不是一个选项。 我对任何需要Python2.6+的东西都持开放态度,但它需要在雪豹和Ubuntu9.10上工作,并且外部要求最低。我不介意一个小的性能惩罚,但我正在寻找标准的最佳方式来处理这个问题 --编辑-- 行结束位于标签描述

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

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

使用 使用打开文件。。。这似乎很疯狂 在我的Mac Snow Leopard上使用不是标准配置,因此不是一个选项。 我对任何需要Python2.6+的东西都持开放态度,但它需要在雪豹和Ubuntu9.10上工作,并且外部要求最低。我不介意一个小的性能惩罚,但我正在寻找标准的最佳方式来处理这个问题

--编辑--


行结束位于标签描述符的中间,否则它们不会是这样的问题。我知道这是一个糟糕的表格,他们不应该将此发送给我,但我就是这样拥有此文件的,而供应商基本上是不称职的。

您打算如何处理此文件?在XML中,标签之间的空白通常被忽略,因此行尾是影响标签内容的唯一地方。

为什么DOS行尾是个问题?大多数事情都可以很好地处理它们,包括XML解析器。如果确实要删除它们,请在通用行尾模式下打开文件:


Python将为您将所有行尾转换为UNIX行尾。如果您真的不能使用我觉得有点奇怪的东西,那么就没有办法让Python为您完成这项工作。无论如何,您都必须打开文件,因此您对2的反对似乎有点奇怪。

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

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

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

编辑:注释说明“rt”是默认值。公平点,但Python风格倾向于明确显式的隐式,所以我要这样做。 我在这里看不到\r\n。也许您的意思是reprxml包含以下内容

"<ParentRedirec\r\ntSequenceID>"
如果不是,试着准确地说出你的意思,用repr时尚的例子

以下方面应起作用:

>>> 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">'
>>>

如果标签中有多个换行符,例如,这将只修复第一个换行符。选择1个循环直到GUFF停止缩小2写一个更聪明的ReXEP自己:-< /P>这家伙在标签描述符中间有一个R:我更喜欢他们把它固定在它们的末端,但是我有点匆忙,只想剥开这些东西。如果是这样的话,它在任何情况下都被破坏了。一个不同点。我曾想过剥离所有类型的换行符,但现在我意识到它不会起作用,因为某些块具有有效的换行符,这些换行符是实际数据的一部分。嗯,只需重新阅读文档-永远不知道您需要打开通用换行符支持。。。我的大部分工作都是在Windows和unix上进行的,幸好新行处理得很好……Windows上的文本模式读取(MS C运行时将为您转换行结尾)与Python的通用行结尾支持不同。所有操作系统上的通用行结尾都是相同的。Windows文本模式是Windows特有的,也会影响其他内容,如EOF字符导致EOF过早。我的系统不提供通用新行。因此,您如何知道是否需要空白?你当然不能只是删除所有的空白。例如,考虑到这个问题,您将如何崩溃?最接近于确定答案。我现在意识到我需要一个更好的文件。这是我第一次听说“t”不是所有地方的默认模式。你能详细说明一下吗?“rt”真的与“r”不同吗?默认值真的是“b”,还是有第三种模式?我在发布后查看了文档。根据我所看到的,我怀疑“t”是默认值,但我觉得显式比隐式好不管怎么说,我也看到很多人在默认情况下只在那里输入一个“b”,即使是在处理文本文件时。这让人难以置信,但事情总是会发生,所以我问;托马斯太温柔了“rt”与“t”相同。@dash tom bang:s/可能有点错/肯定错了/。。。帮你自己一个忙,删除你的答案。你是对的,评论系统去掉了换行符,标签如下:
>>> 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">'
>>>