文件不会写在python中

时间:2009-06-11 23:02:09

标签: python file-io for-loop

我正在尝试替换当前目录中所有文件中的字符串。由于某种原因,我的临时文件结束了空白。看来我的.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()

8 个答案:

答案 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表示正常打印到标准输出