使用Python的fileinput与虚拟文件/ RAM文件



我编写了一些Python代码来使用fileinputinplace操作文件,它看起来像这样:

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)

最新更新