2010-04-05 57 views
4

即时通讯尝试创建一个脚本来打开一个文件并用'hello'替换每个'hola'。Python新手:试图创建一个脚本来打开一个文件并替换文字

f=open("kk.txt","w") 

for line in f: 
    if "hola" in line: 
     line=line.replace('hola','hello') 

f.close() 

但是我得到这个错误:

Traceback (most recent call last):
File "prueba.py", line 3, in for line in f: IOError: [Errno 9] Bad file descriptor

任何想法?

Javi

+1

你为什么要打开与 “W” 模式下的文件?你使用什么教程来学习Python? – 2010-04-05 10:21:30

回答

4

你的主要问题是,你打开的文件先写。当你打开一个文件进行写入,该文件的内容被删除,这使得很难做替换!如果你想在文件中替换的话,你有三个步骤:

  1. 文件读入到一个字符串
  2. 请替换在该字符串
  3. 写一个字符串到文件

在代码:

# open for reading first since we need to get the text out 
f = open('kk.txt','r') 
# step 1 
data = f.read() 
# step 2 
data = data.replace("hola", "hello") 
f.close() 
# *now* open for writing 
f = open('kk.txt', 'w') 
# step 3 
f.write(data) 
f.close() 
+0

我们应该教会初学者从一开始就使用'with' - 请参阅Max Shawabkeh的答案。 – PaulMcG 2010-04-05 13:48:45

+0

@paul我不反对;然而,由于用户在处理文件的概念方面已经很困难,因此我最初决定尽可能使我的答案尽可能接近他的原始代码。由于用户后来的问题指出了Python 2.5(它需要'__future__'中的一个特殊导入),我想我可能不会改变它。当然,如果不是明确的话,其他答案也是同样正确的。 – 2010-04-05 16:20:57

+0

并且要小心,简单的替换将a)不匹配“Hola”并给出“Hello”,并且b)*将匹配'scolar'给'schellor'中的'hola'。 – PaulMcG 2010-04-05 17:49:24

4

您已经打开文件进行编写,但您正在阅读文件。打开原始文件进行阅读并写入新文件。替换后,重新命名原来的和新的。

7
open('test.txt', 'w').write(open('test.txt', 'r').read().replace('hola', 'hello')) 

或者,如果你要正确地关闭文件:

with open('test.txt', 'r') as src: 
    src_text = src.read() 

with open('test.txt', 'w') as dst: 
    dst.write(src_text.replace('hola', 'hello')) 
+0

这是所有的乐趣和游戏,直到你打开一个256MB的机器上的1GB文件... – 2010-04-05 09:35:24

+1

诚然,但对于初学者来说,这是最简单直接的方式。 – 2010-04-05 09:42:06

+1

答案阴影'输入'内置,也许src_text可能是一个更好的变量名? – PaulMcG 2010-04-05 13:49:47

相关问题