我正在尝试用一段文本替换一小段文本。我希望使用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中读取大文本文件?
答案 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
将行列表添加到最初为空的列表。这将让你摆脱后面代码中的一个循环。