我在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()
答案 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以外的平台。