繁体   English   中英

文件不会用python写

[英]file won't write in python

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

只要看一眼事情,看来您的问题出在“ w”上。

看来您一直在覆盖 ,而不是追加

所以您基本上是遍历文件,
到最后,您只将最后一个文件复制到您的临时文件中。

您可能需要使用“ a”而不是“ w”打开文件。

您的代码(正确缩进,尽管我认为没有缩进,因此它可以运行但不能正常工作)实际上看起来是正确的。 请记住,temp.out将仅是最后一个源文件的替换内容。 可能是该文件只是空白吗?

我注意到有时,如果在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..."

@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即可正常打印到标准输出

首先,

您忘记了将临时文件复制回原始文件。

其次:

使用sed -i或perl -i代替python。

例如:

perl -i -pe 's/mrddb2/shpdb2/;s/MRDDB2/SHPDB2/' *

我没有确切的答案,但是可能有帮助的是将一些print线粘贴在重要位置,例如在修改之前先打印每行,然后在修改后再次打印。 然后,在将行修改到文件中之前,将另一行放置在修改之后。 然后在关闭新文件之前执行以下操作:

print secondfile.read()

如果用于调试目的的结果太多,也可以尝试限制获得的结果。 您可以通过在末尾附加下标修饰符来限制字符串输出,例如:

print secondfile.read()[:n]

如果n = 100 ,它将输出限制为100个字符。

如果您的代码实际上如帖子中所示缩进,则表示写入正常。 但是,如果失败,则写调用可能在内部for循环之外。

为了确保我没有真正丢失什么,我测试了代码,它对我来说很好用。 也许您可以尝试继续执行除一个特定文件名以外的所有内容,然后在此之后检查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复制回原始文件?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM