在文件末尾插入文本 n 行

时间:2021-02-20 17:57:27

标签: python-3.x text-manipulation

我有这个文件,我希望能够在 python 中的文件末尾之前写入文本 n 行,我知道 write 方法存在但是它只在文件的最后插入文本.我想做这样的事情:

INSERT INTO `mod238_yoast_seo_meta` VALUES("12749", "0", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12755", "0", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12757", "1", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12765", "1", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12774", "1", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12785", "1", "0");

/* I would like to be able to insert some text here with python/*

SET FOREIGN_KEY_CHECKS = 1; 

/* Duplicator WordPress Timestamp: 2021-01-08 15:49:50*/
/* DUPLICATOR_MYSQLDUMP_EOF */

/* DUPLICATOR_MYSQLDUMP_EOF */ 是文件的最后一行,非常感谢!我也使用 python 3.8。

2 个答案:

答案 0 :(得分:0)

如果您知道从末尾开始要跳过多少行,只需将源文本逐行拆分,添加新文本,然后重新加入:

source_text = '''INSERT INTO `mod238_yoast_seo_meta` VALUES("12749", "0", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12755", "0", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12757", "1", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12765", "1", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12774", "1", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12785", "1", "0");

SET FOREIGN_KEY_CHECKS = 1; 

/* Duplicator WordPress Timestamp: 2021-01-08 15:49:50*/
/* DUPLICATOR_MYSQLDUMP_EOF */'''

custom_text = "my new cool text"
lines_before = 5 # you want to add the new text 5 lines before the end

lines = source_text.split('\n')
lines.insert(-lines_before, "\n" + custom_text)
new_text = "\n".join(lines)

print(new_text)

否则,您可以为此使用正则表达式:

import re

source_text = '''INSERT INTO `mod238_yoast_seo_meta` VALUES("12749", "0", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12755", "0", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12757", "1", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12765", "1", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12774", "1", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12785", "1", "0");

SET FOREIGN_KEY_CHECKS = 1; 

/* Duplicator WordPress Timestamp: 2021-01-08 15:49:50*/
/* DUPLICATOR_MYSQLDUMP_EOF */'''

custom_text = "my new cool text"
new_text = re.sub("\s+(?=SET FOREIGN_KEY_CHECKS)", "\n\n%s\n\n" % custom_text, source_text)

print(new_text)

两种方法都会打印:

INSERT INTO `mod238_yoast_seo_meta` VALUES("12749", "0", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12755", "0", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12757", "1", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12765", "1", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12774", "1", "0");
INSERT INTO `mod238_yoast_seo_meta` VALUES("12785", "1", "0");

my new cool text

SET FOREIGN_KEY_CHECKS = 1;

/* Duplicator WordPress Timestamp: 2021-01-08 15:49:50*/
/* DUPLICATOR_MYSQLDUMP_EOF */

显然,您必须用 new_text 变量的内容覆盖输入文件(或创建一个新文件),而不是打印它。

答案 1 :(得分:0)

解决此问题的一种方法是将文件读入行列表。将新行插入您想要的任何位置。然后将该行列表写入一个新文件。

如果您知道要插入的行号,则可以直接使用该位置。如果您需要根据文件底部的行数计算行位置,您可以将行位置计算为总行数与您的数字 N 之间的差值。

可能看起来像这样:


    # Insert text n lines before the end of file

    file_path = 'text.txt'
    line_to_insert = '/*this is my inserted line*/\n'
    lines_from_bottom = 4

    with open(file_path) as file:
        lines = file.readlines()
        insert_position = len(lines) - lines_from_bottom
        lines.insert(insert_position, line_to_insert)
        with open('new_file.txt', 'w') as new_file:
            for line in lines:
                new_file.write(line)