解析文件Python的最佳方法

时间:2017-05-14 07:52:59

标签: python parsing file-io

我有一个文本文件,我需要阅读,识别要更改的部分,并写入新文件。这是一个文本文件(大约600行)看起来类似于:

的片段
<REAPER_PROJECT 0.1 "4.731/x64" 1431724762
  RIPPLE 0
  RECORD_PATH "Audio" ""
  <RECORD_CFG
    ZXZhdxgA
  >
  <APPLYFX_CFG
  >
  LOCK 1
  <METRONOME 6 2
    VOL 0.25 0.125
    FREQ 800 1600 1
    BEATLEN 4
    SAMPLES "" ""
  >
 >

因此,例如,我需要将“LOCK 1”更改为“LOCK 0”。现在我正在逐行读取文件,查找当我点击“LOCK”关键字然后写“LOCK 1”时,我写“LOCK 0”(所有其他行都按原样写入)。很简单。

这部分看起来对我来说有点混乱,因为有时当我必须使用嵌套的for循环来解析文本文件的子部分时,我会遇到奇怪的处理文件指针的逐个错误 - 不是一个大而且易于管理,但我有点想找到一些意见。 相反,我想知道将整个文件读入列表,解析列表,查找要更改的关键字,更新列表中的特定行,然后将整个列表写入新文件。似乎我会对事物有更多的控制权,因为我不必以线性方式处理文件,我现在不得不这样做。

所以,我猜最后一句话有点合理,为什么将它全部放入列表,处理列表然后写出来是有利的。我有点好奇,其他有更多编程经验的人(因为我有点受限)会解决这类问题。还有什么方法可以证明更有效率吗?

Btw,我没有生成这个文件 - 其他软件没有,我没有与开发人员进行任何沟通,所以我无法知道他们用来读/写文件的内容。如果我有一个能够读取文件并将其填充到变量然后重写它的整齐读者,我会非常喜欢它,但对我来说,编写一些可以做到这一点的东西对于我想要完成的事情来说是过度的。

我有点想重写我的剧本把它读成一个列表,因为它似乎是一个更好的方法,但我想我会问人们在我做之前他们的想法。我的版本有效,但我也不介意动作,因为这是一个很好的教训,无论如何。我认为这也可能是解决问题总有不同方法的情况,但我想尝试尽可能高效。

更新

所以,我可能应该提到这一点,但我仍然想弄清楚要问什么 - 虽然我需要找到某些元素并改变它们,但我只能通过找到它们的标题来找到这些元素(即“ITEM” )然后替换块内的元素。所以它会是这样的:

<METRONOME
  NAME Clicky
  SPEED fast
>
<ITEM
  LOOP 0
  NAME Mike
  FILE something.wav
  ..
>
<ITEM
  LOOP 1
  NAME Joe
  FILE anotherfile.wav
  ..
>

因此,识别正确数据块的唯一方法是首先找到ITEM标头,然后继续读取,直到找到NAME元素,然后更新整个ITEM块的文件名。我需要更新该块中的其他元素,并且名称标题不是第一个项目。另外,我不能假设name元素也存在于ITEM块中。

所以也许这与将其读入内存的关系不大,更多的是如何正确解析这种类型的文件?或者将它读入内存并更容易操作有什么好处?对不起,我没有在原来的问题中澄清......

2 个答案:

答案 0 :(得分:0)

如果它只有~600行,你可以将它带入内存

replace = [('LOCK 1', 'LOCK 0'), (), ()....]
with open('read.txt') as r:
    read = r.read()
    for i in replace:
        read.replace(*i)
    with open('write.txt', 'w') as w:
        w.write(read)

答案 1 :(得分:0)

这是我使用正则表达式的答案:

import re

text = """<REAPER_PROJECT 0.1 "4.731/x64" 1431724762
  RIPPLE 0
  RECORD_PATH "Audio" ""
  <RECORD_CFG
    ZXZhdxgA
  >
  <APPLYFX_CFG
  >
  LOCK 1
  <METRONOME 6 2
    VOL 0.25 0.125
    FREQ 800 1600 1
    BEATLEN 4
    SAMPLES "" ""
  >
 >
"""

print(re.sub("LOCK 1\D", "LOCK 0" + "\n", text))

如果您对将文件写入磁盘感兴趣。

with open("written.txt", 'w') as f:
    f.write(re.sub("LOCK 1\D", "LOCK 0" + "\n", text))

修改

你说你希望它更灵活吗? 好吧,我试图做一个例子,但是为此我需要更多关于你的setup..etc的信息。相反,我会指出一个可以帮助你的资源。这也很好,如果您想要更改或添加任何内容,现在您将了解该怎么做。

  1. https://www.youtube.com/watch?v=DRR9fOXkfRE#正则表达式如何运作 一般的python。

  2. https://regexone.com/references/python#有关的一些信息 正则表达式和python。

  3. https://stackoverflow.com/a/5658439/4837005#使用的一个例子 正则表达式替换字符串。

  4. 我希望这会有所帮助。