[英]Search and replace a line in a .xml file in Python
我需要阅读并替换.xml文件中的一行。 我尝试了几乎所有我可以想象的基于搜索的内容,并替换了Python文件中的一行 ,以及如何使用Python搜索和替换文件中的文本? 。
然后,作为第二步,我认为可以基于删除文件中的特定行(python) ,以及从Python中的文件中删除行来删除该行并在顶部打印新行。
不幸的是,没有任何事情对我有效。 脚本将所有行写为相同的输出,或者写后格式不正确。
然后,我开始阅读封闭式问题,例如如何使用Python从XML中删除元素,但同样,我并不是试图将其作为最终输出。
更新:偶然地,我删除了一行,并且看不到整个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*
之后的所有内容的问题的解决方案,因为当前我替换了整行,但至少它能按预期工作。
谢谢您的时间和精力。
您可以使用它为例。
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。
您只需要替换该字符串即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.