写入文件时出现IOError

时间:2013-05-28 22:57:48

标签: python windows file-io desktop-background

我正在编写一个改变桌面背景的程序。它通过读取文本文件来完成此操作。如果文本文件显示其中一个BG文件名,则将其保存为背景,并将另一个文件的名称写入文件并关闭。

我似乎无法让它发挥作用 这是我的代码:

import sys, os, ctypes

BGfile = open('C:\BG\BG.txt', 'r+' )
BGread = BGfile.read()
x=0
if BGread == 'mod_bg.bmp':
    x = 'BGMATRIX.bmp'
    BGfile.write('BGMATRIX.bmp')
    BGfile.close()

elif BGread == 'BGMATRIX.bmp':
    x = 'mod_bg.bmp'
    BGfile.write('mod_bg.bmp')
    BGfile.close()

pathToImg = x
SPI_SETDESKWALLPAPER = 20  
ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, pathToImg, 0)

当我使用"r+"时,它会给我这个错误:

Traceback (most recent call last):
  File "C:\BG\BG Switch.py", line 13, in <module>
    BGfile.write('mod_bg.bmp')
IOError: [Errno 0] Error

这根本没有帮助!
当我使用"w+"时,它只会删除文件中已有的内容。

任何人都可以告诉我为什么我会收到这个奇怪的错误,还有一种可能的解决方法吗?

1 个答案:

答案 0 :(得分:4)

阅读后,只需在写入模式下重新打开文件:

with open('C:\BG\BG.txt') as bgfile:
    background = bgfile.read()

background = 'BGMATRIX.bmp' if background == 'mod_bg.bmp' else 'mod_bg.bmp'

with open('C:\BG\BG.txt', 'w') as bgfile:
    bgfile.write(background)

SPI_SETDESKWALLPAPER = 20  
ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, background, 0)

如果要打开文件进行读写操作,则必须至少快退到文件的开头并在写入前截断:

with open('C:\BG\BG.txt', 'r+') as bgfile:
    background = bgfile.read()

    background = 'BGMATRIX.bmp' if background == 'mod_bg.bmp' else 'mod_bg.bmp'

    bgfile.seek(0)
    bgfile.truncate() 
    bgfile.write(background)

SPI_SETDESKWALLPAPER = 20  
ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, background, 0)