1

它非常简单,使用下面的小代码,我可以读取文件并匹配我可以找到 musicStyle 字段的位置,并用其他内容替换值并将更改写入文件。它是一个 xml,我知道我可以使用 lxml 或其他 xml 解析器,但我想继续使用 re 模块,因为它并不大,它用于我的个人音乐收藏数据库。

import re

def replace(theFile):
    #for iLine in (line.rstrip('\n') for line in open(theFile,"w")):
        if iLine.find("musicStyle") >= 0:
            mpr = re.search(r'(.*>)(.*?)(<.*)', iLine, re.M|re.I)
            print mpr.group(2)
            # here goes the code to replace the mpr.group(2) 
            # should i use iLine.replace('rock','Metal') ?

if __name__ == '__main__':
    replace('c:\testfile.xml')

提前致谢。

4

3 回答 3

2

fileinput如果您尝试修改同一个文件,请使用该模块:

import fileinput
for iLine in filinput.input(r'c:\testfile.xml',inplace = True):
    if iLine.find("musicStyle") >= 0:
         mpr = re.search(r'(.*>)(.*?)(<.*)', iLine, re.M|re.I)
         #modify iLine here
    print iLine     #write the line to  the file

请注意,当您使用 Windows 路径时,请始终使用原始字符串,否则会发生这种情况:

>>> print 'c:\testfile.xml'
c:  estfile.xml            #'\t' converted to tab space

>>> print r'c:\testfile.xml'   #raw string works fine
c:\testfile.xml
于 2013-07-11T18:07:04.133 回答
0

老实说,最好的办法是将输出写入一个单独的临时文件,然后移动该文件以代替原始文件。

于 2013-07-11T18:01:39.593 回答
0

我能够通过以下方式解决它:

import re

def replace(theFile):
    for line in fileinput.input(theFile,inplace=1):
        if line.find("musicStyle") >= 0:
           mpr = re.search(r'(.*>)(.*?)(<.*)', line, re.M|re.I)
           line = line.replace("rock","metal")
        print line,


if __name__ == '__main__':
    replace('c:\\testfile.xml')

为了避免文件上出现新行,我不得不在行上加上逗号

感谢阿什维尼的指导。

于 2013-07-11T18:17:54.107 回答