在Python中搜索并替换.xml文件中的一行

时间:2015-12-10 18:34:24

标签: python regex xml replace

我需要读取并替换.xml文件中的一行。我根据Search and replace a line in a file in PythonHow to search and replace text in a file using Python?尝试了几乎所有我能想象到的东西。

然后作为第二步,我认为可以删除该行并根据Deleting a specific line in a file (python)Deleting a line from a file in Python在顶部打印新行。

不幸的是,没有任何方法可以正常使用脚本将所有行写为相同的输出,或者写入后格式不正确。

然后我开始阅读诸如How to remove elements from XML using Python之类的关闭问题,但是我并没有尝试将其作为最终输出。

更新:我意外删除了一行,无法看到整个xml代码。

* .xml文件的示例:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="gcm.play.android.samples.com.gcmquickstart"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="23" />

    <!-- [START gcm_permission] -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <!-- Required permission for App measurement to run. -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- [END gcm_permission] -->
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="gcm.play.android.samples.com.gcmquickstart.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

我正在尝试使用另一行删除行package="gcm.play.android.samples.com.gcmquickstart",例如package="another.line"

我正在使用的代码:

def str_replace(file_input, keyword, str_new):
    for line in fileinput.input(file_input, inplace=True):
        line = line.rstrip('\r\n')
        print line.replace(keyword, str_new)
    fileinput.close()
    return

但它无法正常工作它只是在行中找到字符串并只替换字符串。

所需* .xml文件的示例:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="sample.different.line"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="23" />

    <!-- [START gcm_permission] -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <!-- Required permission for App measurement to run. -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- [END gcm_permission] -->
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="gcm.play.android.samples.com.gcmquickstart.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

更新2:感谢Nelson Guaman Leiva我找到了解决问题的部分解决方案。我可以设法找到并替换我文件特定点上的字符串。我的新问题是我在pattern=*whatever text here*之后找不到匹配的方法,我只能找到并替换整个单词,我无法匹配并在等号后替换。

基于新解决方案的代码示例:

def find_and_replace(file_input, str_old, str_new):
    with open(file_input, 'r') as fr:
        xml_data = fr.read()
        xml_data = re.sub(r'{}=\"(.+?)\"'.format(str_old), str_new, xml_data)
    fr.closed
    return

更新3:我忘了在文件中包含进程的写入部分,代码包含在下面。我不确定这个过程是最快还是更充分的读写,但它是一种可能的解决方案。

代码示例:

def str_replace(self, file_input, str_old, str_new):
        with open(file_input, "r") as fr:
            xml_data = fr.read()
            xml_data = re.sub(r"{}=\"(.+?)\"".format(str_old), str_new, xml_data)
        fr.closed

        with open(file_input, "w") as fw:
            fw.write(xml_data)
        fw.closed

        self.replace_string = xml_data
        return self.replace_string

如果我找到了解决问题的方法,如何在package=*whatever here*之后匹配和替换所有内容,因为目前我替换整行,但至少它按预期工作。

感谢您提前花时间和精力。

1 个答案:

答案 0 :(得分:1)

例如,你可以使用它。

import re
with open ("file.xml", "r") as myfile:
    data = myfile.read()

data = re.sub(r"android:name=\"android\.permission\.[A-Z\_]+", "xxxx", data)
print data

这会将所有android.permission.TEXT替换为xxx。

你只需要替换那个字符串。