我需要一个脚本,每 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() 来关闭文件。这确保了每次读取文件后都会关闭文件,以便脚本可以在下次循环时重新打开并读取文件的新内容。