如何在 txt 文件的特定位置放置换行符?

How to put a line breaker inside a specific position in the txt file?

我有一个 .txt 文件,其中包含我研究所需的大量文本信息。所以,我正在尝试编写一个程序来进行关键字搜索(在我的例子中,我需要短语“sold salt”),然后它将以该短语开头的文本逐行写入新文件并剪切在某个时候关闭(我还没有决定)。这实际上是一本包含 17 世纪数字化文件的书,用古俄语写成,但示意性地文本看起来像:

"sheet_№1

文文文文文文

正文正文

text text text text text sold salt text text text text text sold salt text text text text text text text

文文文文文文

sheet_№1_reverse

text text sold salt text text text text text text text text text text text text

所以这是一个非常糟糕的结构化的东西,我想要的是将所有盐销售记录及其在整个文本中的位置放在一个文件中以供我研究。

现在,抱歉介绍太长了,我只是想展示我要处理的内容。

我尝试使用 docx lib 制作代码,但事实证明,唯一可行的方法是在 docx 文件中下划线需要的信息,然后使用代码将其删除,这不是真的很糟糕,但仍然需要时间。

所以我停止了 txt 格式,现在我得到了这个:

key_1 = 'sold'
key_2 = 'salt'

f_old = open("text.txt", encoding='utf-8')
f_result = open("text_result.txt", 'w', encoding='utf-8')

for line in f_old:
    line = line.split()
    if len(line) == 1:
        for elem in range(len(line)):
            f_result.write(line[elem] + '\n')
    else:
        if key_1 in line and key_2 in line:
            for word in range(len(line)):
                if line[word] == key_1 and line[word + 1] == key_2:
                    for elem in line[word: word + 10]:
                        f_result.write(elem + ' ')
                    f_result.write('\n')

f_old.close()
f_result.close()

基于上面的例子,它给了我这个结果:

"sheet_№1

卖盐 text text text text text 卖盐 text

卖盐 text text text text text text

sheet_№1_reverse

卖盐文文文文文文文文文文

用我的手删除“sold salt”和其他额外信息(例如第二行末尾的信息)并不是什么大不了的事情,因为无论如何我都会使用包含比我需要的信息更多的行来完成。但是,如果我的关键字出现在行中两次或更多次,如果有任何想法如何剪行?

我有一个想法打开 text_result 不仅是为了写作,也是为了阅读,然后通过这个来删减行:

for line in f_result:
    line = line.split()
    if len(line) > 1:
        for word in line[::-1]:
            while line[word] != key_1:
                line.pop([word])

但是如果我把它放在这样的代码中,它就不起作用:

key_1 = 'sold'
key_2 = 'salt'
f_old = open("text.txt", encoding='utf-8')
f_result = open("text_result.txt", 'w+', encoding='utf-8')

for line in f_old:
    line = line.split()
    if len(line) == 1:
        for elem in range(len(line)):
            f_result.write(line[elem] + '\n')
    else:
        if key_1 in line and key_2 in line:
            for word in range(len(line)):
                if line[word] == key_1 and line[word + 1] == key_2:
                    for elem in line[word: word + 7]:
                        f_result.write(elem + ' ')
                    f_result.write('\n')

for line in f_result:
    line = line.split()
    if len(line) > 1:
        for word in line[::-1]:
            while line[word] != key_1:
                line.pop([word])

f_old.close()
f_result.close()

我是不是漏掉了一些基本的东西?

提前致谢!!!

因此,根据您提供的信息,我想您希望在看到另一个 sold salt 时停止写作,然后从那里继续写作。这意味着在编写时你只需要再做一次检查(就像你已经做的那样)要进入新文件的单词不是 sold salt,如果是,就从那里中断。它看起来像这样:

for line in f_old:
    line_words = line.split()  # it is confusing changing the value of a variable within the
    # loop, so I would recommend simply creating a new variable
    if len(line_words) == 1:
        # there was no need for a for loop here as we already know that there is only one element
        f_result.write(line_words[0] + '\n')
    else:
        for word in range(len(line_words)-1):  # as you will be accessing word+1 element,
        # you need to look out for out of range indices
            if line_words[word] == key_1 and line_words[word + 1] == key_2:
                for i in range(len(line_words[word: word + 10]))):
                    if i != 0 and line_words[word+i] == key_1 and line_words[word+i+1] == key_2:
                        break

                    f_result.write(line_words[word+i] + ' ')
                f_result.write('\n')


f_result.close()

我还建议使用 enumerate,然后只使用索引来访问您需要的元素后面的元素,我认为它提供了更清晰的代码。