在文件行之前添加文本的更有效和通用的方法?

时间:2016-07-12 17:14:32

标签: python file parsing

我是python的新手。在其中一个任务中,我必须在特定行之前添加一个字符。例如,在我的文本文件中

  

名称

  

是固定行,我必须根据标记

添加或删除;
hey : see
;Name:blah
;Surname:blah

这是我为此编写的代码......它是否足够有效?我们可以写得更有效吗?我们可以通过

  

姓名和姓氏

作为参数我的意思是关键字作为添加

的函数的参数
  

def changefile(filepath,flag):
   # flag = 1
    final = ""
    with open(filepath) as content:
        for line in content:
            if flag==1:
                if line.split(":")[0]==";Name" or line.split(":")[0]==";Surname":
                    final += line[1:]
                else:
                    final += line
            else:
                if line.split(":")[0]=="Name" or line.split(":")[0]=="Surname":
                    final += ";"
                final += line
    f = open(filepath, 'r+')
    f.truncate()
    f.write(final)
    f.close()


changefile("abc.txt",0)

1 个答案:

答案 0 :(得分:0)

我嘲笑了很多,并借用了马蒂诺的想法,并最终得到了这个:

def change_file(filepath, add_comment, trigger_words):

    def process(line):
        line_word = line.lstrip(';').split(':')[0]

        if line_word in trigger_words:
            if add_comment:
                line = line if line.startswith(';') else ';' + line
            else:
                line = line.lstrip(';')

        return line


    with open(filepath) as f:
        content = [process(line) for line in f]


    with open(filepath, 'r+') as f:
        f.truncate()
        f.write(''.join(content))


change_file('abc.txt', add_comment=True, trigger_words=["sys", "netdev"])

主要的“好”位(我喜欢)使用列表推导[process(line) for line in f],因为它取消了整个final = ''; final += blah排列。它处理每一行,这就是输出。

我已经更改了flag所以而不是阅读“标志是0或1 ”(这是什么意思?)它现在显示为“ add_comment是True还是False “,以更清楚地表明它的作用。

在效率方面,可能会更好; (使“trigger_words”成为一组,以便测试成员资格更快,改变其规范化每一行进行测试的方式);但是如果你正在处理一个小文件,那么Python的速度就不会太大了,如果你处理的是一个巨大的文件,那么IO的限制可能比CPU有限。

在线尝试:https://repl.it/CbTo/0(它会读取并打印结果,但不会尝试保存)。

(NB。.lstrip(';')将删除行开头的所有分号,而不只是一行。我假设只有一个分号。

从评论中进行编辑。这是一个版本,它将处理SQL Server UTF-16安装文件而不会搞砸它,但我不知道这个适用于所有文件的一般修复。请注意,这会将文件作为特定数据编码读取,并使用特定数据编码写入二进制文件。并将SQL ini格式的拆分更改为=。并且不truncate,因为w模式可以做到这一点。

import codecs

def change_file(filepath, add_comment, trigger_words):

    def process(line):
        line_word = line.lstrip(';').split('=')[0]

        if line_word in trigger_words:
            if add_comment:
                line = line if line.startswith(';') else ';' + line
            else:
                line = line.lstrip(';')

        return line


    with codecs.open(filepath, encoding='utf-16') as f:
        content = [process(line) for line in f]

    with codecs.open(filepath, 'wb', encoding='utf-16') as f:
        f.write(''.join(content))


change_file('d:/t/ConfigurationFile - Copy.ini', add_comment=True, trigger_words=["ACTION", "ENU"])