python - 编写第二个函数后代码一直输出空白文本文件
问题描述
我正在尝试将一个文本文件转换为同一文件的另一个更有条理的版本。到目前为止,我已经能够在第一个函数中半想要的地方添加换行符。我获取一个输入文件并输出一个输出。
在我的第二个函数中,我使用第一个 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()
解决方案
欢迎来到 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
因为它已经与标准库的内置函数相关联。您将失去对该功能的访问权限。其他会阅读您的代码的人也可能会感到困惑。
推荐阅读
- c++ - 为什么当窗口在一个类中时,SFML 窗口不显示?
- c - RBIE 中断只工作一次 - PIC16F877A
- smpp - kannel收货问题
- python - 度量标准 Python 休息 api
- google-maps - Flutter中的谷歌地图没有响应触摸事件
- java - 如何在字符串中查找模式并删除所有不匹配的内容
- python - 如何在 pygame 中使用 pygame.time.set_timer()?
- cassandra - 如何在 mac 上安装 dsbulk?
- rust - Bindgen 跳过 C++ 头文件中的定义
- python - 如何在开发模式下使用 pip 删除 python 包的依赖项(注意与删除包不同)?