【问题标题】:OSError: [Errno 22] Invalid argument:OSError:[Errno 22] 无效参数:
【发布时间】:2019-04-27 06:35:39
【问题描述】:

我正在使用 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'

【问题讨论】:

  • 您介意分享完整的回溯吗?
  • 是的,我编辑了问题
  • 我相信这需要进一步调试,看起来,问题不在于将转储写入文件,而是首先转储抓取的数据,尝试打印抓取的数据以找出是什么导致了问题。
  • 您运行的确切 Linux 是什么? Errno 22 可能具有平台相关的含义。我建议运行man 2 open,并阅读EINVAL 消息的描述。我想出的最好的理论是O_APPEND ('a') 在某种程度上在您的系统上受到严重支持。尝试使用 ('w'),这将覆盖文件,但如果这有效,那么我们知道问题出在 'a'
  • 另一个想法突然出现在我的脑海中:您是在使用多线程或多处理还是从另一个程序查看此文件?所有晦涩的错误的根源是并发;)

标签: python json


【解决方案1】:

在 Windows 10 上

我注意到我的代码中出现了同样的行为,我发现我使用的是 Microsoft OneDrive,这导致了同样的错误。我试图打开的文件的文件指针在 Windows 资源管理器中可见,但内容不可见。您是否使用任何云文件共享服务?

(我右键单击该文件,选择“始终保留在此设备上”,再次运行相同的代码并成功)。

【讨论】:

    【解决方案2】:

    为什么不将文件作为变量打开?

    f = open("reviews", "a")
    f.write(json.dumps(scraped_data,f,indent = 4))
    f.close()
    

    【讨论】:

    • 您能解释一下这将如何解决 OPs 问题吗?使用上下文管理器来处理打开和关闭文件无处不在。
    • 这不会改变对open的调用,这会产生错误,但如果出现问题,将无法关闭文件描述符。
    【解决方案3】:

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

    确保您有权在该目录中写入(无论应用程序在哪个用户下运行)

    另外,如果文件不存在,它不能追加到它...而不是a 尝试a+

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

    【讨论】:

    • 我试过了,至少在 macOS 和 Debian 'a' 上可以很好地创建新文件...
    • :shrug: docs 说 '+' 用于阅读和写作,但是whatevs...
    • 你是正确的@AndrewMorozko,如果它不是其中之一,那么他们有一个与路径或权限相关的错误。
    • 是的,没有权限问题,尽管有EACCES 。难道我们不能都同意 errno 机制是一个很好的解决方案吗?不会发生任何令人困惑的事情!
    • 我尝试了完整路径和 'a+' 但没有成功:( 我会尝试上述方法
    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2021-02-10
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多