有没有办法将这种文件格式读入Python

时间:2017-05-02 05:40:17

标签: python file-format

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

<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,如果可能的话,对数据进行一些更改,然后将其吐回到文件中。否则,我想我会逐行解析它并进行我需要的更改 - 并非不可能,但如果已经有读者存在则会更容易。

修改

我应该提到我需要以与我读取的格式相同的格式输出数据,因此拥有读写器将是理想的。

1 个答案:

答案 0 :(得分: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>