python - Python 在尝试重命名现有文件时引发 os 错误
问题描述
很抱歉问这样的基本问题,但我现在很迷茫。以下代码会随机引发操作系统错误(没有此类文件或目录),即使文件存在也是如此。
try:
os.rename(ruta,ruta[:-6])
except Exception as e:
print "No pude renombrar la ruta "+ruta+" como "+ruta[:-6]
print e
运行示例:
arivacoba@computer:~/Desarrollo/Medea$ ./nmsorter0.py
---Status messages not relevant to the issue---
---Some status messages about the successful renaming of most directories---
No pude renombrar la ruta /home/arivacoba/Desarrollo/Organizar/Audio/Jazz diverso/2015 VA - Jazz Lounge Classics Vol.2/CD 1.AUDIO como /home/arivacoba/Desarrollo/Organizar/Audio/Jazz diverso/2015 VA - Jazz Lounge Classics Vol.2/CD 1
[Errno 2] No such file or directory
No pude renombrar la ruta /home/arivacoba/Desarrollo/Organizar/Audio/Jazz diverso/2015 VA - Jazz Lounge Classics Vol.2/CD 2.AUDIO como /home/arivacoba/Desarrollo/Organizar/Audio/Jazz diverso/2015 VA - Jazz Lounge Classics Vol.2/CD 2
[Errno 2] No such file or directory
在这个例子中,我已经验证了文件的存在。更重要的是,我可以从 python 重命名文件:
arivacoba@computer:~/Desarrollo/Medea$ python
Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> ruta='/home/arivacoba/Desarrollo/Organizar/Audio/Jazz diverso/2015 VA - Jazz Lounge Classics Vol.2/CD 2.AUDIO'
>>> os.rename(ruta,ruta[:-6])
>>> os.rename('/home/arivacoba/Desarrollo/Organizar/Audio/Jazz diverso/2015 VA - Jazz Lounge Classics Vol.2/CD 1.AUDIO','/home/arivacoba/Desarrollo/Organizar/Audio/Jazz diverso/2015 VA - Jazz Lounge Classics Vol.2/CD 1')
>>>
arivacoba@computer:~/Desarrollo/Medea$ ls ../Organizar/Audio/Jazz\ diverso/2015\ VA\ -\ Jazz\ Lounge\ Classics\ Vol.2/
CD 1 CD 2 front.jpg index.mfo
arivacoba@computer:~/Desarrollo/Medea$
如前所述,它是随机发生的。我将大量语料库传递给应用程序以对其进行处理,但我观察到:
- 如果错误是成批出现的,它总是会发生在同一个目录中。
- 如果在另一个批次中尝试相同的错误目录,即使用其他数据集,它可能会或可能不会引发错误;很可能会正常工作。
- 它永远不会抛出唯一的错误。如果一个批次出现此错误,则至少会有 2 个错误目录。
- 它将在不同平台上运行:我已经尝试在 centos 7、debian Jessie 和 xUbuntu 18.04 上运行它
我已经有一个解决方法,但是让我有点失望的是,我无法在如此简单的代码中看到什么问题。
解决方法
os.system (("mv '%s' '%s'") % (ruta,ruta[:-6]))
工作得很好,虽然有点慢。
更新:每次重命名后插入睡眠,尽管速度很慢:S 这是整个周期的代码,我不知道是什么可能导致这种......竞争条件?
for cada in _restDir:
ruta = os.path.realpath(cada)
ddir = 'DIR'+cada[-5:]
ruta = ruta.replace(DIRBASE,(eval(ddir))
try:
os.rename(ruta,ruta[:-6])
except Exception as e:
print "No pude renombrar la ruta "+ruta+" como "+ruta[:-6]
print e
sleep (0.1)
更新:差不多两年后。我们正在更新整个东西,它在 python 3.6 中完美运行。出于好奇,我安装了 2.7.18 和 2.7.17,并在其他机器上测试(Ubuntu 上是 2.7.16,centos 上是 2.7.11)。好吧,它在 >= 2.7.17 中按预期工作,与 2.7.11 一样频繁/随机中断。Ubuntu 上的 2.7.16 有点有趣。它仍然随机中断,但仅当文件名包含超过 8 个空格时!问我我们是怎么发现的。:D
解决方案
推荐阅读
- reactjs - 使用react-spring的共享模块中的无效挂钩调用
- mysql - 重构 MySQL 字段中的字符串
- django - 1 个表格行中有两个 forloop
- spring - Hibernite 忽略关系 onetomany 和加载集合中的惰性 fetchtype
- c++ - Line Erase Scene:二维空间中的圆与曲线相交问题
- visual-studio-code - 需要重新安装才能解决的频繁 JavaScript 错误
- wordpress - WooCommerce 获取多个订单/批量查询的订单项目数量
- reactjs - 如何重构分享主题信息的material-ui demo
- python - 值错误:无法将字符串转换为浮点数:'<' 使用字符嵌入创建 CNN-LSTM 时
- javascript - 如何获取数组的特定 JSON 元素?