os.remove因斜杠找不到文件
我想删除一个文件。这个文件是之前由我想要删除它的同一个程序创建的。
这是我现在的代码:
USER_FILE_NAME = 'user_info.json'
file_to_delete = os.path.join(ADDON_DATA['profile_dir'], USER_FILE_NAME)
xbmc.log('File to delete:')
print(file_to_delete)
os.remove(file_to_delete)
这是我得到的结果(用户名等信息因为隐私原因被处理掉了):
NOTICE: File to delete:
NOTICE: C:\Users\USERNAME\AppData\Roaming\XBMC\userdata\addon_data\script.NAME\user_info.json
NOTICE: [Errno 2] No such file or directory: u'C:\\Users\\USERNAME\\AppData\\Roaming\\XBMC\\userdata\\addon_data\\script.NAME\\user_info.json'
我觉得问题可能出在那些烦人的斜杠上。我尝试了各种方法,但似乎都没用。无论我对 file_to_delete
这个字符串做什么,包括把反斜杠换成正斜杠,程序试图找到并删除的文件总是和错误信息里的一样。
有人能帮我吗?
更新:
我尝试了一下。我在原来的 os.remove(file_to_delete)
后面加了 os.remove(repr(file_to_delete))
,现在我的代码是这样的:
if os.path.exists(file_to_delete):
xbmc.log('User file exists, Prepairing to delete')
xbmc.log('stats: %s' % os.access(file_to_delete, os.F_OK))
xbmc.log('stats: %s' % os.access(file_to_delete, os.W_OK))
xbmc.log('stats: %s' % os.access(file_to_delete, os.X_OK))
os.remove(file_to_delete)
os.remove(repr(file_to_delete))
如果我把 os.remove(repr(file_to_delete))
注释掉,我会得到和之前一样的错误。如果我不注释这个,但注释掉上面的那个,我会得到这个错误:
User file exists, Prepairing to delete
stats: True
Previous line repeats 2 times.
ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--
.
.
.
os.remove(repr(file_to_delete))
WindowsError: [Error 123] The filename, directory name, or volume label syntax is incorrect: "u'C:\\\\Users\\\\USERNAME\\\\AppData\\\\Roaming\\\\XBMC\\\\userdata\\\\addon_data\\\\script.NAME\\\\user_info.json'"
如果我两个都不注释,直接运行,就会得到和上面一样的错误,但文件确实被删除了。这是什么原因呢?
更新 2:
上面的情况在这个例子中也发生了:
os.remove(file_to_delete)
os.remove(file_to_delete)
文件被删除了,但出现了这个错误:
WindowsError: [Error 2] The system cannot find the file specified: u'C:\\Users\\USERNAME\\AppData\\Roaming\\XBMC\\userdata\\addon_data\\script.NAME\\user_info.json'
当我用 os.remove()
删除同一文件夹里另一个文件时,两个文件都是用 os.path.join()
创建的,删除一次就够了。
有什么想法吗?
2 个回答
0
这个文件名看起来是用Unicode字符串编码的。
你可以试试这个方法:
file_to_delete= unicodedata.normalize('NFKD', file_to_delete).encode('ascii','ignore')
os.remove(file_to_delete)
0
好的,看来我找到了问题所在。我在 os.remove(file_to_delete)
之后加了 time.sleep(2)
,然后它就正常工作了。