在学习scrapy时,保存数据到文件的时候,发现一直出现“找不到这样的文件或文件夹”的错误,最后发现是因为python的相对路径。
学习scrapy时,编写pipeline来将数据保存到文件当中,代码如下:
1
2
3
4
5
6class ():
def process_item(self, item, spider):
with open('Novel/'+str(item['title'][0])+'.txt','w') as f:
for p in item['content']:
f.write(p+'n')
return item
看着爬取时调试信息飞快闪过(爬取的东西有点多),却没有发现我准备好的Novel文件夹里面多出文件,连忙把爬虫停下来。发现出现了“找不到这样的文件或文件夹”的错误。
分析过程
查看日志信息,发现文件名是对的,但是为什么不行呢?
于是我在pipelines.py里面写了测试代码:
1
2with open('Novel/'+'文件名'+'.txt','w') as f:
print(1)
发现同样的错误。
我把前面的文件夹去掉,也就是:
1
2with open('文件名'+'.txt','w') as f:
print(1)
发现文件生成在了我的工作目录下!
这个时候我才注意到相对路径的问题。
当前目录是这样的(略去无关文件):
learn_scrapy文件名.txt
practicepracticepipeline.py
我本来以为这个相对路径会使得文件生成在pipelines.py的同级目录下,但是却生成在了我的VScode的工作文件夹?
我回忆起java课时老师写错相对路径导致无法显示图片的问题。那时也是需要相对当前项目的根目录来写相对路径的。我认为这是eclipse的特性。
会不会这个也是vscode的特性?
于是我搜索“python 相对路径”,找到了和我遇到类似问题的朋友:vscode中使用python相对路径问题?-知乎
我的工作目录是/Work
我在工作目录中创建了文件/Work/Program/main.py 并且运行main.py 生成了 file.txt文件
1
2
3> with open('file.txt','w') as f:
> f.write('HelloWorld')
>
我以为file.txt在/Work/Program路径下,和创建它的main.py在一个路径中
结果file.txt这个文件却在/Work路径下面(/Work/file.txt),而不是我所期望的/Python/Program路径下面
所以应该怎么配置,或者安装什么插件,能让py创建的文件在自己的相对路径下,而不是直接跑到了工作路径那里?
这个问题怎么解决啊,困扰了我好久,而我又比较喜欢vscode的界面不想放弃它。求解答!
看了回答之后我继续搜索,终于解决了困惑。
解决方案
参考链接:
Python里写这种相对路径, 是相对于终端的当前目录的.
解决办法是, 获取脚本所在目录, 构造绝对路径