我有一个 python 代码(在终端上运行),我通过以下代码将 Dataframe 转换为 .csv 文件:
#Converting the dataframe to a csv file
relative_path = os.path.dirname(__file__)
df.to_csv(relative_path+"/"+args.cleaned, index=False)
其中
args.cleaned
在代码的上半部分定义如下:
import argparse
parser = argparse.ArgumentParser(description="Run data cleaning.")
parser.add_argument('--cleaned', type=str, default='final.csv', help='Cleaned csv output')
执行此操作时,我收到以下错误:
OSError: [Errno 30] Read-only file system: '/final.csv'
我在 Google 和 stackOverflow 上搜索了此错误,并尝试了一些方法,例如使用 chmod 授予对工作目录的读/写权限。我得到的最相关的来源是这个 stackOverflow 链接。但它涉及目录,许多解决方案不适用于像我使用 .csv 文件一样的文件。
重要提示:此代码在同一设备的同一工作目录中成功运行了好几个月,而且我从未遇到过任何问题。最近我不得不重新安装 Anaconda 和 Python,就在这之后,我遇到了这个问题。
我浏览了几乎所有与此错误相关的 StackOverflow 帖子,但没有找到解决方案,特别是针对 Python 中的 .csv 文件。
如有任何建议,我们将不胜感激。
我找到了解决办法。感谢@Yuri 的评论,因为我认为
relative_path
不会有任何问题,因为正如我在问题中提到的那样,相同的代码之前工作正常。
因此我打印了
__file__
和 relative_path
以进行调试。令人惊讶的是 __file__
打印了正确的值,但 relative_path
是空的!也就是说,不知何故,os.path.dirname(__file__)
返回一个空字符串!这对我来说完全出乎意料,因为我已经在相同的位置使用相同的 IDE(PyCharm)使用了相同的代码,并且这行代码从未遇到过问题。
无论如何,然后我尝试了绝对路径来确保我得到脚本文件的绝对路径,无论它是如何执行的。以下代码行解决了错误:
script_path = os.path.dirname(os.path.realpath(__file__))
df.to_csv(script_path+"/"+args.cleaned, index=False)