在给定文件对象的文件中间插入字符串

2024-05-15 00:27:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个问题,结果被墙卡住了

我有一组(可能很大)文本文件,我需要对其应用一系列过滤器和转换,并将其导出到其他地方。在

所以我大概有

def apply_filter_transformer(basepath = None, newpath = None, fts= None):
    #because all the raw studies in basepath should not be modified, so I first cp all to newpath
    for i in listdir(basepath):
        file(path.join(newpath, i), "wb").writelines(file(path.join(basepath, i)).readlines())
    for i in listdir(newpath):
        fileobj = open(path.join(newpath, i), "r+")
        for fcn in fts:
            fileobj = fcn(fileobj)
        if fileobj is not None:
            fileobj.writelines(fileobj.readlines())
        try:
            fileobj.close()
        except:
            print i, "at", fcn
            pass
def main():
    apply_filter_transformer(path.join(pardir, pardir, "studies"),
                         path.abspath(path.join(pardir, pardir, "filtered_studies")),
                         [
                        #transformer_addMemo,
                          filter_executable,
                          transformer_identity,
                          filter_identity,
                          ])

apply_filter_transformer中的fts是一个函数列表,它接受python文件对象并返回python文件对象。我遇到的问题是,当我想在一个文本对象中插入字符串时,我遇到了一个不具信息性的错误,整个上午都被卡住了。在

^{pr2}$

这给了我

Traceback (most recent call last):
 File "E:\mypy\reg_test\src\preprocessor\preprocessor.py", line 292, in <module>
  main()
 File "E:\mypy\reg_test\src\preprocessor\preprocessor.py", line 288, in main
 filter_identity,
 File "E:\mypy\reg_test\src\preprocessor\preprocessor.py", line 276, in     apply_filter_transformer
   fileobj.writelines(fileobj.readlines())
   IOError: [Errno 0] Error

如果有人能给我更多关于错误的信息,我将非常感激。在


Tags: pathinnoneforfilterapplyjoinfts
2条回答

有一个方便的python模块可以修改或读取一组文件:fileinput

我不知道是什么导致了这个错误。但是,您正在将整个文件读入内存,这在您的情况下不是一个好主意,因为这些文件可能很大。使用fileinput可以轻松地替换文件。例如:

import fileinput
import sys

for line in fileinput.input(list_of_files, inplace=True):
    sys.stdout.write(line)
    if keyword in line:
         sys.stdout.write(my_text)

实际上不可能从您发布的代码中判断出导致错误的原因。问题可能出在您为转换函数所采用的协议中。在

我将简化代码:

fileobj = file.open(path, mode)
fileobj = fcn(fileobj)
fileobj.writelines(fileobj.readlines())

我能保证fcn返回一个以原始文件模式打开的文件?它返回一个完全打开的文件?它返回一个文件?嗯,我不知道

你似乎没有任何理由在你的进程中使用文件对象。既然要将整个文件读入内存,为什么不让转换函数接受并返回字符串呢?所以你的代码应该是这样的:

^{pr2}$

除此之外,这会将程序的文件I/O部分与数据转换部分完全分离,这样一来,一个部分中的问题就不会影响到另一个部分。在

相关问题 更多 >

    热门问题