当我将 pandas 数据框保存为 csv 文件时,3 位数字从 18 位长列中被截断

3 digits are truncated from an 18 digit long column when I save my pandas dataframe as a csv file

我从一个由 JSON 文件填充的字典创建了一个数据框。我的数据框中的 "id" 列包含 18 位整数。当我使用 python 打印 ids 时,该值等于 JSON 文件中的原始值,但是当我尝试将我的数据框保存为 csv 文件时,id 列以科学记数法保存,并且还有三个ids 右侧的数字将转换为零。 如何防止csv文件中的id值转换为科学计数法?

例如,当我查看 csv 时,id 得到 1.01045E+17,当我看到值时,我得到 101044874404577000,而 true值为 101044874404577281

这是我的代码:

with open(data_path, encoding="utf8") as input_file:
    data = json.load(input_file)
df = pd.DataFrame.from_dict(data)
df.to_csv(output_path)

我曾尝试将列的格式从 astype 更改为 strobjectfloat64,但这没有帮助。 我已经设置 to_csv 函数的 float_format 参数来保存具有指定小数位数的浮点数。这也没有用。

问题不在于转换为 csv,而是在将其加载到电子表格时。众所周知,Excel 对 csv 文件的支持很差,不幸的是,LibreOffice calc 尽力模仿 Excel...

它看到一个数字并错误地将其转换为双精度值。

演示:

在python中:

>>> x = 101044874404577281
>>> data = [{"id": x, "str": "foo"}]
>>> fd = io.StringIO()
>>> json.dump(data, fd)
>>> fd.seek(0,0)
0
>>> df = pd.read_json(fd)
>>> print(df)
                   id  str
0  101044874404577281  foo

好的,这里一切都很好。让我们继续:

>>> df.to_csv('foo.csv', index=False)

在哑文本编辑器中打开时,foo.csv如果仍然正常:

id,str
101044874404577281,foo

让我们将其加载到电子表格中:

calc 真丢人,它用科学记数法表示!让我们使用正常显示:

唉……最后的数字都毁了……

TL/DR:这在 Python 和 pandas 中都不是问题,甚至在 csv 文件中也不是问题,而只是在 Excel.