0

我正在尝试解析特定的文本文件。我正在尝试打开文本文件并逐行询问是否存在特定字符串(在以下示例中,大括号中存在数字 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()

我错过了一些简单的东西吗?

4

3 回答 3

1

stringreplace方法不会按位置替换字符,它会用它们是什么字符来替换它们。

>>> '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".

于 2012-08-30T04:46:49.333 回答
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}")):
于 2012-08-30T04:44:55.547 回答
0

您可以使用 count 参数replace()

'USC_45774-1111-0     <hkxhk> {10} ; 78'.replace("hk","kh",1)

对于第二个问题,您需要将条件更改为:

if "{01}" in line or "{-1}" in line:
    ...
于 2012-08-30T04:45:28.483 回答