簡體   English   中英

編寫第二個 function 后代碼一直輸出空白文本文件

[英]Code keeps outputting blank text file after writing second function

我正在嘗試將一個文本文件轉換為同一文件的另一個更有條理的版本。 到目前為止,我已經能夠在第一個 function 中半想要的地方添加換行符。 我取出一個輸入文件並吐出一個 output。

在我的第二個 function 中,我使用第一個 fn 中的 output 作為輸入。 我正在嘗試使用 fileinput 庫,但每次運行代碼時 output 文件都是空白的。 我還嘗試簡單地替換文本,它仍然輸出一個空白文本文件。 我在這里想念什么?

代碼:

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()

這是代碼的圖像。

歡迎來到 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()

但我更喜歡的解決方案是遍歷文件一次,並且在將這一行寫入 output 文件之前,對每一行進行所有所需的修改:

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賦值,因為它已經與標准庫的內置 function相關聯。 您將無法訪問該 function。 其他會閱讀您的代碼的人也可能會感到困惑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM