我正在尝试替换当前目录中所有文件中的字符串。由于某种原因,我的临时文件结束了空白。看来我的.write没有工作,因为第二个文件可能在其范围之外声明了吗?我是python的新手,所以仍然在攀登学习曲线......谢谢!
编辑:我知道我的临时文件当前没有被复制。我也知道有更有效的方法可以做到这一点。我这样做是为了练习。如果有人能够具体回答为什么.write方法无法在这里工作,那就太好了。谢谢!
import os
import shutil
for filename in os.listdir("."):
file1 = open(filename,'r')
secondfile = open("temp.out",'w')
print filename
for line in file1:
line2 = line.replace('mrddb2.','shpdb2.')
line3 = line2.replace('MRDDB2.','SHPDB2.')
secondfile.write(line3)
print 'file copy in progress'
file1.close()
secondfile.close()
答案 0 :(得分:5)
只是看了一眼,看来你的问题是'w'。
看起来你保持覆盖,而不是追加。
所以你基本上是循环遍历文件,
到最后,您只将最后一个文件复制到临时文件中。
您可能希望使用'a'而不是'w'打开文件。
答案 1 :(得分:2)
您的代码(正确缩进,但我认为没有办法缩进它以便它运行但不能正常工作)实际上似乎是正确的。请记住,temp.out将只是最后一个源文件的替换内容。可能是那个文件只是空白吗?
答案 2 :(得分:0)
首先,
您忘记将临时文件复制回原始文件。
其次:
使用sed -i或perl -i而不是python。
例如:
perl -i -pe 's/mrddb2/shpdb2/;s/MRDDB2/SHPDB2/' *
答案 3 :(得分:0)
我没有给你确切的答案,但可能有帮助的是在战略位置粘贴一些print
行,比如在修改之前打印每一行,然后在修改之后再次打印。然后在将行修改到文件之前放置另一个。然后在关闭新文件之前执行:
print secondfile.read()
如果有太多用于调试的目的,您也可以尝试限制获得的结果。您可以通过将下标修饰符附加到末尾来限制字符串输出,例如:
print secondfile.read()[:n]
如果n = 100
,它会将输出限制为100个字符。
答案 4 :(得分:0)
如果您的代码实际上是缩进的,如帖子中所示,则写入工作正常。但如果失败,则写调用可能在内部for循环之外。
答案 5 :(得分:0)
为了确保我没有真正遗漏某些东西,我测试了代码,它对我来说很好。也许你可以尝试继续除了一个特定的文件名之外的所有内容,然后检查temp.out的内容。
import os
for filename in os.listdir("."):
if filename != 'findme.txt': continue
print 'Processing', filename
file1 = open(filename,'r')
secondfile = open("temp.out",'w')
print filename
for line in file1:
line2 = line.replace('mrddb2.','shpdb2.')
line3 = line2.replace('MRDDB2.','SHPDB2.')
print 'About to write:', line3
secondfile.write(line3)
print 'Done with', filename
file1.close()
secondfile.close()
另外,正如其他人所提到的,每次处理新文件时,你只是在破坏temp.out文件。你还导入了shutil而没有用它做任何事情。您是否忘记将temp.out复制回原始文件?
答案 6 :(得分:0)
我注意到,如果你在file.write之后没有file.close,它有时会打印到文件。
例如,这个程序实际上从未保存到文件,它只是创建一个空文件(除非你在outfile.write之后添加outfile.close()。)
outfile=open("ok.txt","w")
fc="filecontents"
outfile.write(fc.encode("utf-8"))
while 1:
print "working..."
答案 7 :(得分:0)
@OP,您可能还想尝试fileinput模块(这样,您不必使用自己的临时文件)
import fileinput
for filename in os.listdir("."):
for line in fileinput.FileInput(filename,inplace=1):
line = line.strip().replace('mrddb2.','shpdb2.')
line = line.strip().replace('MRDDB2.','SHPDB2.')
print line
将“inplace”设置为1以便编辑文件。设置为0表示正常打印到标准输出