用一个文本块替换特定文本

时间:2016-09-20 06:13:51

标签: python replace readline

我正在尝试用一段文本替换一小段文本。我希望使用python的replace函数替换这个文本块。我真的很想用sed来完成这项工作,但我在Windows机器上。无论如何这里是我的脚本,不知道为什么文本块没有被替换。

# Change the current working directory to IDX location
import os
print os.getcwd()
os.chdir(##location of my text files##) 
print os.getcwd()

#Read file names

com_line=raw_input("File name please:")
contents=[]
strs = '#DREFIELD IDOL_SOURCE="idol source"\n#DREFIELD IDOL_TAXONOMY="taxonomy data"\n #DREFIELD IDOL_CATEGORY="IDOL_CATEGORY"\n #DREFIELD IDOL_PROMOTION="idol_promotion"\n #DREFIELD IDOL_PROMOTION_TERM="IDOL_PROMOTION_TERM"\n #DREFIELD IDOL_WHATSNEW="IDOL_WHATSNEW"\n #DREFIELD IDOL_SUMMARY="IDOL_SUMMARY"\n #DREFIELD IDOL_URL="IDOL_URL DATA"\n #DREFIELD IDOL_FORMNUMBER="IDOL_FORMNUMBER"\n #DREFIELD IDOL_DESCRIPTION="IDOL_DESCRIPTION DATA"\n#DRESECTION 0\n'
with open(com_line) as f:
     contents.append(f.readlines())
f.close

#Writing to file
f2 = open("test.idx", 'w')

for content in contents:
    for s in content:
        if s == '#DRESECTION 0\n':
            s.replace("#DRESECTION 0\n", strs)
        f2.write("%s" % s)
f2.close

我测试了这段代码,它也进入了条件语句。只是想知道为什么有必要的文字#DRESECTION 0\n没有被strs取代?此外,我期待这个大文本文件的操作值得几个演出。有没有更好的方法在python中读取大文本文件?

1 个答案:

答案 0 :(得分:3)

Python中的Stings是不可变的。一旦创建了一个字符串对象,就无法对其进行修改。但是,您可以根据旧字符串创建新字符串。

当您致电s.replace时,它不会修改s,因为这是不可能的。相反,str.replace方法返回一个新字符串。你可以做s = s.replace(...)它应该有效。但是,当您只需将名称重新绑定到新字符串时,将一个字符串的全部内容替换为另一个字符串是没有意义的。

我建议使用:

    if s == '#DRESECTION 0\n':
        s = strs
    f2.write(s)

我也改变了write电话。这里不需要使用字符串替换,因为你想要编写整个字符串(而不是额外的)。只需传递s作为参数。

您的代码还有一些其他小问题:

例如,您没有在文件上调用close方法,只是命名它们。如果要实际关闭文件,则需要f2.close()。但您实际上并不需要为f执行此操作,因为您使用的with语句会自动关闭文件(您应该使用with f2并且不打扰手动close来电。)

似乎还不太需要contents成为嵌套列表(外部列表中只有一个项目)。您可能希望contents = f.readlines()而不是append将行列表添加到最初为空的列表。这将让你摆脱后面代码中的一个循环。