我如何在Python(文件操作)中执行此操作?

时间:2010-05-27 17:19:53

标签: python file-io

我在HTML文件夹中有一堆HTML文件。这些HTML文件有unicode字符,我使用filter(lambda x: x in string.printable, line)解决了这些问题。现在我如何将更改写回原始文件?这样做的最佳方式是什么?每个HTML文件的大小为30 kb。

  1 import os, string
  2 
  3 for file in os.listdir("HTML/"):
  4     print file
  5     myfile = open('HTML/' + file)
  6     fileList = myfile.readlines()
  9     for line in fileList:
 10         #print line
 11         line = filter(lambda x: x in string.printable, line)
 12     myfile.close()

3 个答案:

答案 0 :(得分:3)

使用fileinput模块。它允许您在适当的位置读取和写入相同的文件:

import fileinput,sys,os
files=[os.path.join('HTML',filename) for filename in os.listdir("HTML/")]
for line in fileinput.input(files, inplace=True):    
    line = filter(lambda x: x in string.printable, line)
    sys.stdout.write(line)

答案 1 :(得分:2)

起初我不明白@~ unutbu的内容是什么,但在阅读了fileinput模块的文档后,我发现了这个,这是我以前从未见过的(强调我的):

  

可选的就地过滤:如果是   传递关键字参数inplace = 1   到fileinput.input()或者到   FileInput构造函数,文件是   移动到备份文件和标准   输出定向到输入文件   (如果是与...同名的文件   备份文件已经存在,它将是   安静地替换)。这样做   可以编写一个过滤器   在适当的位置重写其输入文件。如果   给出了备份参数   (通常为backup ='。'),它指定了   备份文件的扩展名,以及   备份文件仍然存在;通过   默认情况下,扩展名为“.bak”和   它在输出文件时被删除   关闭。就地过滤已禁用   当读取标准输入时。

所以我认为他的答案是最好的,这就解释了原因。

答案 2 :(得分:0)

这适用于Linux;对其他操作系统的支持是不确定的(见下文)。

import os, string

for file in os.listdir("HTML/"):
    print file
    myfile = open('HTML/' + file)
    fileList = myfile.readlines()
    for pos, line in enumerate(fileList):
        line = filter(lambda x: x in string.printable, line) # see note 1
        fileList[pos] = line                                 
    myfile.close()
    myfile = open('HTML/' + file, "wz") # see note 2
    myfile.write("\n".join(fileList))

注1。简单地分配到line不会更改fileList。变量实际上是对象上的标签(引用):分配给标签会更改标签附加到的对象。该行创建一个列表,然后分配

注2。“wz”文件模式在打开时清空文件(传递给open()时,它应该等同于O_TRUNC标志)。它可能不适用于Linux以外的平台。