我正在尝试解析特定的文本文件。我试图打开文本文件并逐行询问是否存在特定字符串(在下面的示例中,大括号中存在数字01),然后操纵特定字符串向前或向前转发,或保留它相同。这是一个例子,其中一行命名为“go”...(完整文件中的其他行具有相似的格式,但有{01}, {00}
等...
go = 'USC_45774-1111-0 <hkxhk> {10} ; 78'
go = go.replace(go[22:24],go[23:21:-1])
>>> go
'USC_45774-1111-0 <khxkh> {10} ; 78'
我试图操纵第一个"hk" (go[22:24])
,用相同的字母替换(go[23:21:-1)
。我想要的是看khxhk
,但正如你所看到的,结果我我得到的是两个都转向khxkh
。
我也遇到了为每一行执行特定if语句的问题。许多没有{01}
的行被操纵,好像它们一样....
with open('c:/LG 1A.txt', 'r') as rfp:
with open('C:/output5.txt', 'w') as wfp:
for line in rfp.readlines():
if "{01}" or "{-1}" in line:
line = line.replace(line[25:27],line[26:24:-1])
line = line.replace("<"," ")
line = line.replace(">"," ")
line = line.replace("x"," ")
wfp.write(line)
elif "{10}" or "{1-}" in line:
line = line.replace(line[22:24],line[23:21:-1])
line = line.replace("<"," ")
line = line.replace(">"," ")
line = line.replace("x"," ")
wfp.write(line)
elif "{11}" in line:
line = line.replace(line[22:27],line[26:21:-1])
line = line.replace("<"," ")
line = line.replace(">"," ")
line = line.replace("x"," ")
wfp.write(line)
wfp.close()
我错过了一些简单的东西吗?
答案 0 :(得分:1)
字符串replace
方法不会按位置替换字符,而是用它们的字符替换它们。
>>> 'apple aardvark'.replace('a', '!')
'!pple !!rdv!rk'
所以在你的第一个案例中,你要告诉用“kh”替换“hk”。它并不“知道”您只想替换其中一个事件;它只知道你想用“kh”代替“hk”,所以它取代了所有的事件。
您可以使用count
参数进行替换,以指定您只想替换第一个匹配项:
>>> go = 'USC_45774-1111-0 <hkxhk> {10} ; 78'
... go.replace(go[22:24],go[23:21:-1],1)
'USC_45774-1111-0 <khxhk> {10} ; 78'
但请注意,这将始终替换第一个出现次数,而不一定是您指定的字符串中位置的出现次数。在这种情况下,我猜这就是你想要的,但它可能无法直接用于其他类似的任务。 (也就是说,没有办法使用此方法来替换第二次出现或第三次出现;您只能替换第一次,前两次或前三次等。要替换第二次或第三次你需要多做一些事情。)
至于问题的第二部分,你误解了if "{01}" or "{-1}" in line
的含义。用外行人的话来说,这意味着if "{01}" or if "{-1}" in line
。由于if "{01}"
始终为真(即字符串“{01}”不是假值),因此整个条件始终为真。你想要的是if "{01}" in line or "{-1}" in line"
。
答案 1 :(得分:0)
我不知道Python是什么,但你的问题是每天至少发布几次。
if "{01}" or "{-1}" in line:
这不符合你的想法。它问,“"{01}"
是真的吗?”因为它是一个非零长度的字符串,所以它是。由于or
短路,因此第一个参数为真,因此未测试其余条件。因此,if
语句的正文始终执行。
换句话说,Python评估就像你写的那样:
if ("{01}") or ("{-1}" in line):
你想要这样的东西:
if "{01}" in line or "{-1}" in line:
或者,如果你有很多类似的条件:
if any(x in line for x in ("{01}", "{-1}")):
答案 2 :(得分:0)
您可以使用replace()
的计数参数:
'USC_45774-1111-0 <hkxhk> {10} ; 78'.replace("hk","kh",1)
对于第二个问题,您需要将条件更改为:
if "{01}" in line or "{-1}" in line:
...