为什么我从os.open()获得int作为返回值?

Why am I getting int as a return value from os.open()?

提问人:tfam 提问时间:10/10/2023 更新时间:10/10/2023 访问量:54

问:

我正在使用 json 模块做某事,但每当我使用 json.dump 或 json.load 函数时,我都会收到一个错误,说 int 没有 .write() 或 .read() 函数。这意味着使用 os.open(“somefile.txt”) 给了我一个 int 而不是普通文件 obj。

如果我尝试这样的事情:

import os
import json

file = os.open("Some_file.json", flags= os.RDWR | os.TRUNC)

data = {"something": "something"}

json.dump(data, file)

我收到这样的错误:

AttributeError: 'int' object has no attribute 'write'

我正在使用 Python 3.12

我尝试通过将 .dumps 和 .loads 与 os.read() 中的字符串一起使用来解决它,但 .loads() 不适用于字符串中的文件。

我尝试了这样的事情:

import os
import json

file = os.open("Some_file.json", flags= os.RDONLY | os.TEXT)

raw_data = os.read(file)

decoded_data = raw_data.decode()

data = json.loads(decoded_data)

并得到了这个:

  raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

有没有办法再次获取正常的文件对象,或者有没有办法解决此问题?

python json 文件处理

评论

3赞 Barmar 10/10/2023
os.open()记录为返回文件描述符,该描述符是一个整数。如果要将其转换为 Python 文件对象,请调用os.fdopen(file, "w")
5赞 Dietrich Epp 10/10/2023
为什么不直接使用?如果需要转换文件描述符,则可以使用,但是如果可以,则使用似乎是显而易见的。open()os.fdopen()open()
0赞 Barmar 10/10/2023
我在文档中没有看到。并且需要 2 个参数。os.TEXTos.read()
0赞 Barmar 10/10/2023
os.RDONLY | os.TEXT应该是os.O_RDONLY | os.O_TEXT
0赞 tfam 10/10/2023
我以前从未见过。我不确定什么时候,但os.open()执行了os.fdopen()的工作。我从来没有意识到他们改变了它,我使用的网站也没有说什么。谢谢你的信息。os.fdopen()

答:

-1赞 nisakova 10/10/2023 #1

你能打开一个文件进行写入并转储json数据吗

with open("Some_file.json", 'w') as file:

    data = {"something": "something"}

    json.dump(data, file)

评论

0赞 tripleee 10/10/2023
不过,这不是他们要问的(没关系,这可能是他们应该问的)