【问题标题】:pythonic equivalent this sed commandpythonic 等效于这个 sed 命令
【发布时间】:2013-08-30 11:10:31
【问题描述】:

我有这个 awk/sed 命令

awk '{full=full$0}END{print full;}' initial.xml | sed 's|</Product>|</Product>\
|g' > final.xml

破坏包含大量标签的 XML 文档 这样新文件将在一行中包含产品节点的所有内容

我正在尝试使用 os.system 和 subprocess 模块运行它,但这会将文件的所有内容包装到一行中。

任何人都可以将其转换为等效的 python 脚本吗? 谢谢!

【问题讨论】:

  • 为什么不使用 XML 解析器呢?看看ElementTree API
  • 你的awk 代码看起来在full$0 之间缺少+
  • 要补充@MartijnPieters 所说的内容,请查看lxml library
  • @MikeVella:这是一个需要安装的外部库。要从标签中提取文本,stdlib xml.etree 库就足够了。
  • 我必须处理文件,使产品标签的内容在同一行,以便我可以确定当我将它传递给映射器时,映射器具有产品的完整信息我正在使用映射器进行 XML 处理,以分配作业并使其运行更快,数据非常庞大

标签: python sed


【解决方案1】:

这样的?

from __future__ import print_function
import fileinput
for line in fileinput.input('initial.xml'):
    print(line.rstrip('\n').replace('</Product>','</Product>\n'),end='')

我使用print 函数是因为Python 2.x 中默认的print 会在每组输出后添加一个空格或换行符。 There are various other ways to work around that,其中一些涉及在打印之前缓冲您的输出。

为了记录,您的问题同样可以通过一个简单的 Awk 脚本来解决。

awk '{ gsub(/<Product>/,"&\n"); printf $0 }' initial.xml

在没有尾随换行符的情况下打印输出将比缓冲整个文件然后在最后打印它要高效得多,当然,Awk 也具有执行替换的所有必要功能。 (不过,gsub 并非在所有 awk 方言中都可用。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2010-09-10
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多