Python 用文本块替换特定文本
我试图用一块文本替换一小段文本。我希望使用python的replace函数替换这段文本。我真的很想使用Python 用文本块替换特定文本,python,replace,readline,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()
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中的大型文本文件?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
语句将自动关闭文件(您可能应该为f2
使用with
,而不必手动执行close
调用)
似乎也不太需要
内容
成为嵌套列表(外部列表中只有一项)。您可能希望执行contents=f.readlines()
操作,而不是将行列表追加到最初为空的列表中。这将使您摆脱后面代码中的一个循环。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
语句将自动关闭文件(您可能应该为f2
使用with
,而不必手动执行close
调用)
似乎也不太需要内容
成为嵌套列表(外部列表中只有一项)。您可能希望执行contents=f.readlines()
操作,而不是将行列表追加到最初为空的列表中。这将使您在后面的代码中摆脱其中一个循环