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

时间:2014-07-16 09:10:50

标签: python file-io

我已经编写了一些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查找处理字符串或类似内容的其他模块。
  • 以某种与操作系统无关的方式创建Python内部虚拟文件。

请注意fileinput以自己特有的方式实现文件操作,特别是通过重定向fileinput来写入文件的当前位置。因此,没有直接的方式来使用相同(或非常相似)的操作来修改其他内容,例如字符串。这是我遇到问题的主要原因。

2 个答案:

答案 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次它仍将是相同。