【问题标题】:Remove a particular item in the file删除文件中的特定项目
【发布时间】:2014-05-15 05:33:38
【问题描述】:

我的输入文件是:

അദ്ദേഹം --> മന്‍മോഹന്‍സിംഗ്  
അദ്ദേഹത്തെ --> അദ്ദേഹം --> മന്‍മോഹന്‍സിംഗ് 
അവന്‍ --> രാമന്‍ 
അവള്‍ക്ക് --> സീതയെ 
അവള്‍ --> അവള്‍ക്ക് --> സീതയെ 
അത്‌ --> പൂവ്‌ 
അവര്‍ --> അവള്‍ക്ക് --> സീതയെ , അവന്‍ --> രാമന്‍ , ലക്ഷ്മണന്‍
അവിടെ --> കോട്ടയത്ത്‌ 
അവര്‍ക്ക്‌ --> മന്‍മോഹന്‍സിംഗ് , അവള്‍ക്ക് --> സീതയെ , ലക്ഷ്മണന്‍ , അവന്‍ --> രാമന്‍ 
അവിടെ --> അവിടെ --> കോട്ടയത്ത്‌ 
അവന്‍ --> ലക്ഷ്മനനെ 
അവനെ --> ലക്ഷ്മണന്‍ 
അവള്‍ക്ക്‌ --> സീതയെ 
അവന്‍ --> രാമന്‍ 

我想要的输出文件包含:

അദ്ദേഹം --> മന്‍മോഹന്‍സിംഗ്  
അദ്ദേഹത്തെ --> മന്‍മോഹന്‍സിംഗ് 
അവന്‍ --> രാമന്‍ 
അവള്‍ക്ക് --> സീതയെ 
അവള്‍ --> സീതയെ 
അത്‌ --> പൂവ്‌ 
അവര്‍ --> സീതയെ,രാമന്‍ ,ലക്ഷ്മണന്‍
അവിടെ --> കോട്ടയത്ത്‌ 
അവര്‍ക്ക്‌ --> മന്‍മോഹന്‍സിംഗ് ,സീതയെ,ലക്ഷ്മണന്‍ ,രാമന്‍ 
അവിടെ --> കോട്ടയത്ത്‌ 
അവന്‍ --> ലക്ഷ്മനനെ 
അവനെ --> ലക്ഷ്മണന്‍ 
അവള്‍ക്ക്‌ --> സീതയെ 
അവന്‍ --> രാമന്‍ 

ie,如果有超过 1 个 '-->' 字符,则需要修改该行。所以我的代码从列表中的位置 2 开始,因为需要第一个 '-->'。并检查列表中的当前和下一个项目。但它没有工作。 我的代码是:

fq = codecs.open('resolvedanaphora.txt', encoding='utf-8')
lines = fq.readlines()
fq.close()
for line in lines:
if ',' in line:
    words=[]    
    words=line.split()  
    for i in range(2,len(words)):
        if '-->' in words[i+1]:
            print 'yes'
            words[i]=''
            words[i+1]=''
    for w in words:
        fa.write(w)
    while len(words) > 0 : words.pop()

    else:
        fa.write(line)
    fa.write('\n')

fa.close()

我得到了一个空白的输出文件。并在终端中显示错误。错误是

if '-->' in words[i+1]:  
IndexError: list index out of range

【问题讨论】:

  • 如果你没有得到想要的输出,把你得到的东西放进去。
  • 您正在检查一个索引 if words[i+1]=='-->' 的 3 个字符,因为 --> 不是单个字符。
  • split 可能没有做你想做的事。此外,在完成整个文件之前,只需让一行工作。编写一个函数并用一行输入对其进行测试。
  • 试试这个if words[i] == '-' and words[i+1] == '-' and words[i+2] == '>' :
  • 编辑了我的输入文件,使得列表包含 '-->' 作为单个标记。

标签: python list file


【解决方案1】:
import codecs
with codecs.open('out.txt', 'w') as fa:
    with open('in.txt') as fhandle:
        for line in fhandle:
            i = line.find('-->') + 3
            line = line[:i] + re.sub(r'\b\w+\s*-->', '', line[i:])
            fa.write(line)

你的字符集不适合我。所以,我尝试作为输入:

a-->b
def-->hij-->klm
123-->456 ,789-->qwe,rty, uio-->pas

输出是:

a-->b
def-->klm
123-->456 ,qwe,rty, pas

上面的代码通过查找--> 的第一次出现来工作。直到--> 第一次出现(包括第一次出现)的所有文本都保持不变。在接下来的文本中,进行了替换:删除任何出现在 --> 之后的单词。然后将结果行写入文件。

虽然在这里无害,file 是保留字。因此,新代码使用fhandle 代替file

原代码注释

  • line.split()空白 处分割行。这不适用于您的输入,因为 (a) 逗号和 (b) --> 字符并不总是被空格包围。

  • 循环for w in words: fa.write(w) 将所有单词串在一起,没有空格。

【讨论】:

  • 不错的答案。我正在借用你的正则表达式来在我的解决方案 +1 中获得相同的结果以进行学习。谢谢
【解决方案2】:

split 在空白处拆分。

>>> line = 'അവര്‍-->അവള്‍ക്ക്-->സീതയെ,അവന്‍-->രാമന്‍ ,ലക്ഷ്മണന്‍'
>>> line.split()
['അവര്‍-->അവള്‍ക്ക്-->സീതയെ,അവന്‍-->രാമന്‍', ',ലക്ഷ്മണന്‍']

您可能希望根据逗号进行拆分,然后根据“-->”进行拆分。如果你得到两个以上的元素,只保留第一个和最后一个,并用'-->'连接。

>>> line.split(',')
['അവര്‍-->അവള്‍ക്ക്-->സീതയെ', 'അവന്‍-->രാമന്‍', 'ലക്ഷ്മണന്‍']

我不知道你想对其他元素做什么,但我们只看第一个子元素。

>>> sub = 'അവര്‍-->അവള്‍ക്ക്-->സീതയെ'
>>> links = sub.split('-->')
>>> links
['അവര്‍', 'അവള്‍ക്ക്സീ', 'തയെ']

>>> if len(links) > 2:
...    collapsed = [links[0], links[-1]]

>>> collapsed
['അവര്‍', 'തയെ']

我们可以将数组中的元素用'-->'分隔:

>>> link = '-->'.join(collapsed)
>>> link
'അവര്‍-->തയെ'

如果你想加入其他元素:

>>> ' ,'.join([link, 'അവന്‍-->രാമന്‍', 'ലക്ഷ്മണന്‍'])
'അവര്‍-->തയെ ,അവന്‍-->രാമന്‍ ,ലക്ഷ്മണന്‍'

【讨论】:

    【解决方案3】:

    代替那个方法试试这个来替换所有-->除了第一次出现

    for s in lines:
            substr = "-->"
            try:
                first_occurrence = s.index(substr) + len(substr)
            except ValueError:
                pass
            else:
                s = s[:first_occurrence] + re.sub(r'\b\w+\s*-->', '', s[first_occurrence:])
            print s
    input
    a-->b
    b-->c,b-->d,b-->e
    c->d
    
    output
    
    a-->b
    b-->c,d,e
    c-->d
    

    【讨论】:

    • 我认为他们试图折叠链接,以便 first --> middle --> last 变为 first --> last
    • @PeterWood no but .it is first--> middle, first-->last 变成 first-->middle,last
    【解决方案4】:

    我得到了正确的输出。我将研究上面给出的答案。我的代码如下。

    import codecs
    fq = codecs.open('resolvedanaphora.txt', encoding='utf-8')
    lines = fq.readlines()
    fq.close()
    fa = codecs.open('resolvedana.txt', 'w')
    for i in lines:
        words=i.split()
        for i in range(2,len(words)):
                if words[i]=='-->':
                    words[i]=''
                    words[i-1]= ''
        for w in words:
            if w!='':
                fa.write(w.encode('UTF-8'))
                fa.write(' ')
        fa.write('\n')
    fa.close()  
    

    如果列表中的项目是 '-->',则当前项目和上一个项目将替换为 ''。由于 '' 不需要写入输出文件,因此将其忽略。

    输出是:

    അദ്ദേഹം --> മന്‍മോഹന്‍സിംഗ്
    അദ്ദേഹത്തെ --> മന്‍മോഹന്‍സിംഗ്
    അവന്‍ --> രാമന്‍
    അവള്‍ക്ക് --> സീതയെ
    അവള്‍ --> സീതയെ
    അത്‌ --> പൂവ്‌
    അവര്‍ --> സീതയെ , രാമന്‍
    അവിടെ --> കോട്ടയത്ത്‌
    അവര്‍ക്ക്‌ --> സീതയെ , രാമന്‍
    അവിടെ --> കോട്ടയത്ത്‌
    അവന്‍ --> ലക്ഷ്മനനെ
    അവനെ --> ലക്ഷ്മണന്‍
    അവള്‍ക്ക്‌ --> സീതയെ
    അവന്‍ --> രാമന്‍
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 2016-01-29
      • 2019-04-01
      • 1970-01-01
      相关资源
      最近更新 更多