os.remove因斜杠找不到文件

1 投票
2 回答
3516 浏览
提问于 2025-04-18 08:26

我想删除一个文件。这个文件是之前由我想要删除它的同一个程序创建的。

这是我现在的代码:

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),然后它就正常工作了。

撰写回答