操作系统错误:[Errno 22] 无效的参数。

3

我正在使用Python从一个网站上爬取大量评论,对于每个评论,我调用“review”函数,然后打开文件并将其附加到文件中。它可以工作一段时间,但是随后每次出现以下错误,而且不是相同的评论。

OSError: [Errno 22] 无效参数

我尝试了json.dumps:

scraped_data = reviews(line)
with open('reviews','a' ) as f:
    f.write(json.dumps(scraped_data,f,indent = 4))

但是同样的错误一直出现。我还尝试了json.dump:
scraped_data = reviews(line)
with open('reviews','a' ) as f:
    json.dump(scraped_data,f,indent = 4))

出于某种原因,我尝试了不缩进的方式。

编辑:json.dumps的完整回溯:

Traceback (most recent call last):
File "s.py", line 202, in <module>
with open('reviews','a' ) as f:
OSError: [Errno 22] Invalid argument: 'reviews' 

json.dump的完整回溯:

Traceback (most recent call last):
File "s.py", line 203, in <module>
json.dump(scraped_data,f,indent = 4)
OSError: [Errno 22] Invalid argument: 'reviews'

2
请问你可以分享完整的追踪信息吗? - Mike
你运行的是哪个 Linux 版本呢?Errno 22 可能与平台相关,建议运行 man 2 open 命令,查看 EINVAL 错误信息的描述。我想到的最好的解释是在你的系统上,O_APPEND ('a') 支持不够好。尝试使用 ('w') 选项,这会覆盖文件,但如果这样可以正常工作,就说明问题出在 'a' 上。 - Andrew Morozko
可能是操作系统告诉你打开的文件太多了?如果你将 scraped_data 硬编码为一个固定字符串,是否会得到相同的结果? - Wodin
1
又有一个想法突然浮现在我脑海中:你是否正在使用多线程或多进程,或从另一个程序中查看此文件?所有晦涩 Bug 的根源都是并发性;) - Andrew Morozko
这真的与JSON有关系吗?还是说这是一个打开文件的问题?此外,它是否与网络爬虫有任何关系,还是只是在那个上下文中发生了?请从您的代码中提取一个[mcve]。另外,作为新用户,请参加[tour]并阅读[ask]。 - Ulrich Eckhardt
显示剩余2条评论
3个回答

7

在Windows 10上

我注意到我的代码中出现了同样的问题,后来发现是因为我正在使用Microsoft OneDrive导致了同样的错误。我尝试打开的文件在Windows资源管理器中看得到其文件指针,但无法查看内容。你是否使用任何云文件共享服务?

(我右键单击文件,选择“始终保留在此设备上”,再次运行相同的代码,它就能正常工作了)。


我也遇到了同样的问题。我正在将一些推文附加到文件中,但是出现了“OSError:[Errno 22]无效参数:”的错误。当我切换到安装在双启动模式下的Ubuntu并且文件存储在本地时,错误消失了。 我尝试选择“始终保留在此设备上”,但似乎对我不起作用。 - Deepak Uniyal

0

尝试给出文件的完整路径。

确保您有在该目录中写入的权限(无论应用程序正在运行的用户是谁)

此外,如果文件不存在,则无法将其附加到文件...请尝试使用a+而不是a

加号表示如果它不存在则创建它


我尝试过,在macOS和Debian上至少使用'a'可以很好地创建新文件... - Andrew Morozko
1
“耸肩”:文档说'+'是用于读取和写入,但无论如何... - Andrew Morozko
如果不是那些问题的话,@AndrewMorozko 你说得对,那么他们可能会遇到与路径或权限相关的错误。 - Sina Khelil
是的,我没有考虑到权限问题,尽管有 EACCES 可以处理。我们能不能都认同 errno 机制是一个很好的解决方案呢?它从来不会出现任何混淆! - Andrew Morozko
你是如何构建完整路径的?你使用了os.path.join()吗?你确定你拥有正确的权限吗?请确保拥有权限的用户是应用程序正在运行的用户。 - Sina Khelil
显示剩余3条评论

0
为什么不将你的文件作为一个变量打开?
f = open("reviews", "a")
f.write(json.dumps(scraped_data,f,indent = 4))
f.close()

你能解释一下这将如何解决OP的问题吗?使用上下文管理器来处理打开和关闭文件是无处不在的。 - SuperShoot
1
这不会改变对open的调用,它会产生一个错误,但如果出现问题,则无法关闭文件描述符。 - Andrew Morozko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接