首页 > 解决方案 > 编写第二个函数后代码一直输出空白文本文件

问题描述

我正在尝试将一个文本文件转换为同一文件的另一个更有条理的版本。到目前为止,我已经能够在第一个函数中半想要的地方添加换行符。我获取一个输入文件并输出一个输出。

在我的第二个函数中,我使用第一个 fn 的输出作为输入。我正在尝试使用 fileinput 库,但每次运行代码时,输​​出文件都是空白的。我还尝试简单地替换文本,它仍然输出一个空白文本文件。我在这里想念什么?

代码:

import re


def setup():
    input = open(r'C:\Users\Phillipos Admasu\Documents\India\india_work.txt', 'r+')
    output = open(r'C:\Users\Phillipos Admasu\Documents\India\india_work_final.txt', 'w+')

    for line in input:
        output.write(re.sub('\s', '\n', line))  # This makes a line break after every Data unit.

    input.close()
    output.close()

def edits():
    input = open(r'C:\Users\Phillipos Admasu\Documents\India\india_work_final.txt', 'w+')
    output2 = open(r'C:\Users\Phillipos Admasu\Documents\India\india_work_final.txt', 'w+')

    for line in input:

            output2.write(re.sub('blue', 'TEST', line))


    input.close()
    output2.close()


if __name__ == "__main__":
    setup()
    edits()

这是代码的图像。

标签: pythonpython-3.xregexfunction

解决方案


欢迎来到 StackOverflow!正如 Ann Zen 在评论中所说,我认为你的问题是因为edits()你试图从你以模式打开的文件中读取行,该'w+'模式将在对文件执行任何操作之前截断(如果你愿意,则为空)你的文件。

如果您真的想在两个不同的函数中修改此文件,我还建议您使用中间文件。那会给出类似的东西:

import re

def setup():
    input_file_name = r'C:\Users\Phillipos Admasu\Documents\India\india_work.txt'
    intermediate_file_name = r'C:\Users\Phillipos Admasu\Documents\India\india_work_inter.txt'

    with open(input_file_name) as input_file:
        with open(intermediate_file_name, 'w') as intermediate_file:
            for current_line in input_file:
                intermediate_file.write(re.sub(r'\s', '\n', current_line))

def edits():
    intermediate_file_name = r'C:\Users\Phillipos Admasu\Documents\India\india_work_inter.txt'
    output_file_name = r'C:\Users\Phillipos Admasu\Documents\India\india_work_final.txt'

    with open(intermediate_file_name) as intermediate_file:
        with open(output_file_name, "w") as output_file:
            for current_line in intermediate_file:
                output_file.write(re.sub(r'blue', 'TEST', current_line))

if __name__ == '__main__':
    setup()
    edits()

但是,您可以使用内存中的临时缓冲区,而不是使用临时文件,使用io.StringIO. 那会给出类似的东西:

import re
import io

temporary_buffer = io.StringIO()

def setup():
    input_file_name = r'C:\Users\Phillipos Admasu\Documents\India\india_work.txt'

    with open(input_file_name) as input_file:
        for current_line in input_file:
            temporary_buffer.write(re.sub(r'\s', '\n', current_line))

def edits():
    output_file_name = r'C:\Users\Phillipos Admasu\Documents\India\india_work_final.txt'

    with open(output_file_name, "w") as output_file:
        output_text = temporary_buffer.getvalue()
        output_text = re.sub('blue', 'TEST', output_text)
        output_file.write(output_text)

if __name__ == '__main__':
    setup()
    edits()
    temporary_buffer.close()

但我更喜欢的解决方案是遍历文件一次,并且在将这一行写入输出文件之前,对每一行进行所有需要的修改:

import re

input_file_name = r'C:\Users\Phillipos Admasu\Documents\India\india_work.txt'
output_file_name = r'C:\Users\Phillipos Admasu\Documents\India\india_work_final.txt'

matchers = (
    (re.compile(r'\s'), '\n'),
    (re.compile(r'blue'), 'TEST')
)

with open(input_file_name) as input_file:
    with open(output_file_name, 'w') as output_file:
        for line in input_file:
            output_line = line
            for current_matcher, replacement_string in matchers:
                output_line = current_matcher.sub(replacement_string, output_line)
            output_file.write(output_line)

顺便说一句,就像 Karl Knechtel 在评论中所说的那样,不要为名称赋值,input因为它已经与标准库的内置函数相关联。您将失去对该功能的访问权限。其他会阅读您的代码的人也可能会感到困惑。


推荐阅读