我已经编写了一些Python代码来使用带有fileinput
的{{1}}来处理文件,这看起来很像:
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
),我会更频繁地调用它,这会导致大量不必要的读取和写这个文件¹。
有没有改变上述代码的好方法而不改变使用的函数这样只能读取和写入这个特殊文件?我正在寻找操作系统 - 独立的方式,所以,例如,我不能在RAM磁盘上制作文件的临时副本,或者希望操作系统足够智能,以避免在程序完成之前将文件实际写入磁盘。
我能想到这个问题的方法,但是哪个需要功能,我找不到:
d.dat
对字符串而不是文件进行操作。fileinput
。fileinput
之类的print
查找处理字符串或类似内容的其他模块。请注意fileinput
以自己特有的方式实现文件操作,特别是通过重定向fileinput
来写入文件的当前位置。因此,没有直接的方式来使用相同(或非常相似)的操作来修改其他内容,例如字符串。这是我遇到问题的主要原因。
答案 0 :(得分:-1)
如果您不想破坏代码的基本结构,可以应用如下所示的小型重构。
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)
答案 1 :(得分:-1)
查看代码,我会将do_stuff_with_file函数的读/写移出,而只是将数据传递给函数。那将需要你在别处打开文件。如果你像我说的那样创建这个类,你可以创建三个方法,一个用于打开和关闭文件,一个用于清理内存,另一个用于更改 - 在第一个中调用它。
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次它仍将是相同。