利用 Python 的循环搜索和替换功能处理不断变化文件

62 阅读2分钟

我需要一个脚本,每 3 秒运行一次,读取一个文本文件,对其进行清理并将其另存为另一个文本文件。而原始文本文件在持续变化,它是一个来自歌曲播放程序的当前歌曲标题。我搜集了一些 Python 代码片段,并将其修改以满足我的需求。目前我有一个脚本可以正常工作,可以完成每个命令和调度。但是,当原始文件再次发生改变时,脚本会报错。

错误信息:

Traceback <most recent call last>:
File "radio_script.py", line 29, in <module>
   executeSomthing<>
File "radio_script.py", line 10, in executeSomething
  for line in intext:
IoError: [Errno 9] Bad file descriptor

我的脚本在 Windows 上运行。所以当脚本运行时,如果一行包含任何 "delete_lin" 的单词,整行都会被删除。而每个 "line replace" 条目都会将这些单词替换为空,就像它们应该的那样。

下面是我的脚本:

# -*- coding: utf-8 -*-
delete_lin = ['VP', 'VH', 'VT', 'VB', 'VS', 'BG']
import time
import os
def executeSomething():
    with open('current.txt', 'r') as intext, open('currentedit.txt', 'w') as outfile:
       for line in intext:
         if not any(delete_lin in line for delete_lin in delete_lin):
           line = line.replace('(email)', "")                           
           line = line.replace('_AO VIVO', "")
           line = line.replace('Ao Vivo', "")
           line = line.replace('AO VIVO', "")
           line = line.replace('(04)', "")
           line = line.replace('2016', "")
           line = line.replace('2015', "")
           line = line.replace('2014', "")
           line = line.replace('2013', "")
           outfile.write(line)
           outfile.flush()
           intext.flush()
           print 'Pause'
           time.sleep(3)

while True:
    executeSomething()

2、解决方案

为了解决这个问题,需要在每次读取文件后再关闭文件,以便脚本可以重新打开并读取文件的新内容。以下是修改后的脚本:

# -*- coding: utf-8 -*-
delete_lin = ['VP', 'VH', 'VT', 'VB', 'VS', 'BG']
import time
import os
def executeSomething():
    with open('current.txt', 'r') as intext, open('currentedit.txt', 'w') as outfile:
       for line in intext:
         if not any(delete_lin in line for delete_lin in delete_lin):
           line = line.replace('(email)', "")                           
           line = line.replace('_AO VIVO', "")
           line = line.replace('Ao Vivo', "")
           line = line.replace('AO VIVO', "")
           line = line.replace('(04)', "")
           line = line.replace('2016', "")
           line = line.replace('2015', "")
           line = line.replace('2014', "")
           line = line.replace('2013', "")
           outfile.write(line)
    intext.close()
    outfile.close()
    print 'Pause'
    time.sleep(3)

while True:
    executeSomething()

在修改后的脚本中,我在 for 循环后添加了 intext.close()outfile.close() 来关闭文件。这确保了每次读取文件后都会关闭文件,以便脚本可以在下次循环时重新打开并读取文件的新内容。