我需要读取并替换.xml文件中的一行。我根据Search and replace a line in a file in Python和How 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*
之后匹配和替换所有内容,因为目前我替换整行,但至少它按预期工作。
感谢您提前花时间和精力。
答案 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。
你只需要替换那个字符串。