我编写了一些Python代码来使用fileinput
和inplace
操作文件,它看起来像这样:
import fileinput
def do_stuff_with_file(filename, parameters):
for line in fileinput.input(filename, inplace=1):
new_line = do_a_lot_of_stuff_with(line, parameters)
print_something(line, parameters)
print new_line,
print_some_more(line, parameters)
do_stuff_with_file(["a.dat","b.dat"], parameters[1])
do_stuff_with_file("c.dat", parameters[2])
do_stuff_with_file("a.dat", parameters[3])
for i in range(100):
do_stuff_with_file("d.dat", parameters[i])
虽然我通常对每个文件调用do_stuff_with_file
一次或两次,但有一个文件(这里是d.dat
)我更频繁地调用它,这导致了对该文件的大量不必要的读写。
是否有好的方法来改变上面的代码而不改变所使用的函数,使得这个特殊的文件只被读写一次?我正在寻找与操作系统无关的方法,因此,例如,我不能在RAM磁盘上临时复制文件,或者希望操作系统足够智能,以避免实际将文件写入磁盘,直到程序完成。
解决这个问题的方法,我能想到,但需要函数,我没找到:
- 让
fileinput
操作一个字符串而不是一个文件。 - " Rewinding "
fileinput
. - 一定要确保文件保持打开状态(并使用临时副本)。
- 找到其他模块处理字符串或类似使用
print
fileinput
做。 - 以某种与操作系统无关的方式创建一个python内部的虚拟文件。
请注意,fileinput
以自己独特的方式实现文件操作,特别是通过将print
重定向到写入文件的当前位置。因此,没有直接的方法可以使用相同(或非常相似)的操作来修改其他东西,例如字符串。这就是我的问题的主要原因。
查看您的代码,我会将读/写从do_stuff_with_file函数中移出,而不是将数据传递给函数。这需要你在其他地方打开文件。如果你像我说的那样创建这个类,你将创建三个方法,一个用于打开和关闭文件,一个用于清理内存,另一个用于alter-它在第一个方法中被调用。
class FileManipulation():
def __init__(self, filename):
self.filename = filename
self.data = open(self.filename,'r').read()
def fileManage(self, parameters):
f = open(self.filename,'w')
output = self.do_stuff_with_file(self.data, parameters)
f.write(output)
f.close()
def fileManageOpen(self):
self.data = open(self.filename, 'r').read()
def fileManageClose(self):
self.data = None
def do_stuff_with_file(self,data, parameters):
output = None
for line in data:
output = do_a_lot_of_stuff_with(line, parameters)
return output
def do_something_using(n_parameter):
## do something with this number
pass
a = FileManipulation('a.dat')
b = FileManipulation('b.dat')
c = FileManipulation('c.dat')
a.fileManageOpen()
a.fileManage(do_something_using(a.data[1]))
a.fileManageClose()
b.fileManageOpen()
b.fileManage(do_something_using(b.data[2]))
b.fileManageClose()
new_parameters = []
c.fileManageOpen()
for i in xrange(100):
new_parameters.append(do_something_using(c.data[i]))
c.fileManage(new_parameters)
c.fileManageClose()
这样,只有当你调用fileManageOpen()时,你才真正读取文件,do_something()将只处理已经存储在实例中的数据。
对不起,如果这不是太有帮助,但你的问题对我来说有点抽象,我不知道为什么你需要打开和关闭文件不止一次,如果你改变它100次,它将保持不变。
如果您不想破坏代码的基本结构,可以应用如下的小重构
import fileinput
def do_stuff_with_file(lines, filename, parameters):
for line in lines:
if fileinput.filename() == filename:
new_line = do_a_lot_of_stuff_with(line, parameters)
print_something(line, parameters)
print new_line,
print_some_more(line, parameters)
else:
print line
filenames = ["a.dat", "b.dat", "c.dat"]
lines = fileinput.input(filenames, inplace=1)
do_stuff_with_file(lines, "a.dat", parameters)
do_stuff_with_file(lines, "b.dat", parameters)
do_stuff_with_file(lines, "a.dat", parameters)
do_stuff_with_file(lines, "c.dat", parameters)
do_stuff_with_file(lines, "c.dat", parameters)