2014-01-29 221 views
-1

我试图逐行读取文件。如果在字典中找到,我想用值替换键值并将内容写入新文件。这里的逻辑:在Python中读取和写入文件

fout = open(output_file,"w+") 

with open(input_file, 'r') as fin: 
    for line in fin: 
     for key in sorted(Db): 
      if re.match(key,line): 
       line = re.sub(key,Db[key],line) ## line 246 
       fout.write(line) 
       break 
      else: 
       fout.write(line) 

每当我试图运行这个文件,我得到以下回溯:

Traceback (most recent call last): 
    File "final.py", line 246, in <module> 
    if re.match(key,line): 
    File "c:\Python33\lib\re.py", line 156, in match 
    return _compile(pattern, flags).match(string) 
    File "c:\Python33\lib\functools.py", line 258, in wrapper 
    result = user_function(*args, **kwds) 
    File "c:\Python33\lib\re.py", line 274, in _compile 
    return sre_compile.compile(pattern, flags) 
    File "c:\Python33\lib\sre_compile.py", line 493, in compile 
    p = sre_parse.parse(p, flags) 
    File "c:\Python33\lib\sre_parse.py", line 724, in parse 
    p = _parse_sub(source, pattern, 0) 
    File "c:\Python33\lib\sre_parse.py", line 347, in _parse_sub 
    itemsappend(_parse(source, state)) 
    File "c:\Python33\lib\sre_parse.py", line 552, in _parse 
    raise error("nothing to repeat") 
sre_constants.error: nothing to repeat 

请让我知道如果我失去了一些东西。提前致谢。

感谢, 阿南德

+0

看起来像一个糟糕的正则表达式模式。你应该检查'Db'的内容。如果你自己没有发现任何可疑的东西,请将它们张贴在这里。 –

回答

4

我想你应该自己尝试和调试这个问题。这是我会做的。 线246之前在脚本中添加一个print语句:

print key, 
print Db[key] 
print line 

根据输出,采取行动。 要测试什么可以工作,你可以使用python解释器。 假设你得到上面打印的:

关键

键123

你可以测试一下:

line = 'key 123' 
re.sub('key', 'foo', line) 
'foo 123' 

在这种情况下,它的工作原理。我相信你很快就会发现问题所在。祝你好运!

+1

+1,用于良好的“打印”调试。特别是在学习python时,OP似乎在做什么...:D – Kraay89

+0

我实际上想知道是否解释如何调试某些东西在stackoverflow上是可以接受的答案(我刚加入)。人们知道如何解决问题通常更有用,这就是我写这个的原因。 –

+0

这可能不是一个可以接受的答案,因为,让我们面对它吧,事实并非如此。但它至少是一个非常有用的评论。使用这种方法学到了很多关于python的内部知识(但我还远远不能说我是一个有经验的程序员xD) – Kraay89