【问题标题】:Is there any way to read this file format into Python有没有办法将这种文件格式读入 Python
【发布时间】:2017-05-02 05:40:17
【问题描述】:

这个文件格式看起来像任何人以前见过的任何东西吗(我修剪了很多,所以你只能看到格式):

<REAPER_PROJECT 0.1 "5.29/x64" 1493370961
  RIPPLE 0
  GROUPOVERRIDE 0 0 0
  AUTOXFADE 1
  ENVATTACH 1
  <TRACK {1157FED1-D15B-4B2B-A89E-BF3696E69030}
    NAME "Station VT"
    PEAKCOL 29129222
    <ITEM
      PLAYRATE 1 1 0 -1 0 0.0025
      CHANMODE 0
      GUID {2493C675-0CB3-433B-B8CD-D661290D7980}
      <SOURCE WAVE
        FILE "Audio\04-KTKE VT-glued-131121_1022 render 001.wav"
      >
    >
    <ITEM
      PLAYRATE 1 1 0 -1 0 0.0425
      CHANMODE 0
      GUID {2493C123-0C32-466B-B8CD-D66129123123}
      <SOURCE WAVE
        FILE "Audio\131343121_1022 render 001.wav"
      >
    >
  >
>

我已经联系了生成此文件的程序的供应商,看看他们是否可以让我知道他们是如何生成该文件的,但我不确定我是否会从他们那里得到答复。我猜它是结构的结构或类似的东西?有点猜测,因为我不熟悉许多其他语言。

最终我想将它读入 Python,如果可能的话,对数据进行一些更改,然后将其吐回文件中。否则我想我会逐行解析它并进行我需要的更改 - 并非不可能,但如果已经存在阅读器会容易得多。

编辑

我应该提到我需要以与我读入的格式相同的格式输出数据,所以最好有一个读取器/写入器。

【问题讨论】:

  • 拥有这种文件格式的人肯定重新发明了轮子,一个丑陋的轮子。请他们使用 xml。
  • @swatchai 嗯...我想知道。它接近 XML,但不完全。我不知道他们为什么走这条路,但他们做到了。不幸的是,我怀疑这种格式很快就会改变,因为它是一种在许多工作室中使用的专业录音软件,而且他们可能没有太多理由改变它。

标签: python file-format


【解决方案1】:

您可以将其转换为 XML,例如:

def to_XML():
    with open('test/REAPER_in.txt') as f_in,\
         open('test/REAPER.xml', 'w') as f_out:

        tags = []
        while True:
            line = f_in.readline()[:-1].strip(' ')
            if not line: break

            if line.startswith('<'):
                eot = line.find(' ')
                if eot > -1:
                    tag = line[1:eot]
                    data = line[eot+1:].replace('"', '')
                    f_out.write( '<%s data="%s">\n' % (tag, data))


                else:
                    tag = line[1:]
                    f_out.write('<%s>\n' % (tag) )

                tags.append(tag)

            elif line.startswith('>'):
                tag = tags.pop()
                f_out.write('</%s>\n' % tag)

            else:
                eot = line.find(' ')
                tag = line[:eot]
                data = line[eot+1:].replace('"', '')
                f_out.write( '<%s>%s</%s>\n' % (tag, data, tag) )

输出

<REAPER_PROJECT data="0.1 5.29/x64 1493370961">  
<RIPPLE>0</RIPPLE>  
<GROUPOVERRIDE>0 0 0</GROUPOVERRIDE>  
<AUTOXFADE>1</AUTOXFADE>  
<ENVATTACH>1</ENVATTACH>  
<TRACK data="{1157FED1-D15B-4B2B-A89E-BF3696E69030}">  
<NAME>Station VT</NAME>  
<PEAKCOL>29129222</PEAKCOL>  
<ITEM>  
<PLAYRATE>1 1 0 -1 0 0.0025</PLAYRATE>  
<CHANMODE>0</CHANMODE>  
<GUID>{2493C675-0CB3-433B-B8CD-D661290D7980}</GUID>  
<SOURCE data="WAVE">  
<FILE>Audio\04-KTKE VT-glued-131121_1022 render 001.wav</FILE>  
</SOURCE>  
</ITEM>  
</TRACK>
</REAPER_PROJECT>

【讨论】:

  • 所以,唯一的问题是我仍然需要以原始格式写回文件......但话虽如此,我知道格式并不会那么难.最终我希望有人能认出这种格式,但它看起来像是开发人员编写的自定义格式,而不是使用像 XML 这样的标准化格式。
  • 抱歉,我不太清楚我需要以相同的格式输出 - 我添加了一个 EDIT 以更清楚地说明这一点。感谢您的建议!
  • 可以使用XML parser 以相同的格式输出。取决于是否值得努力。
  • 我认为有一些有错误处理的东西会很好。如果我在原始文本文件中翻转内容,运行程序(收割机)并打开文件,它仍然能够找到数据,然后在保存时重新排序元素。所以他们显然已经为这种格式编写了某种处理程序——我只是好奇它是否看起来像任何人曾经使用过的任何东西——甚至来自其他语言?我想知道它是否只是一个可以转储某种复杂数据类型并读入的工具。
  • 我明白你的意思。格式非常接近XML。添加格式 tag attribute 强制将其写入 100% 作为原始格式。
猜你喜欢
  • 2011-05-21
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 2019-09-08
  • 1970-01-01
相关资源
最近更新 更多