我已经看到了一些将 Python 中的格式化二进制文件读取到 Pandas 的方法, 也就是说,我正在使用这段代码,该代码使用 NumPy fromfile 读取,该文件格式为使用 dtype 给出的结构。
import numpy as np
import pandas as pd
input_file_name = 'test.hst'
input_file = open(input_file_name, 'rb')
header = input_file.read(96)
dt_header = np.dtype([('version', 'i4'),
('copyright', 'S64'),
('symbol', 'S12'),
('period', 'i4'),
('digits', 'i4'),
('timesign', 'i4'),
('last_sync', 'i4')])
header = np.fromstring(header, dt_header)
dt_records = np.dtype([('ctm', 'i4'),
('open', 'f8'),
('low', 'f8'),
('high', 'f8'),
('close', 'f8'),
('volume', 'f8')])
records = np.fromfile(input_file, dt_records)
input_file.close()
df_records = pd.DataFrame(records)
# Now, do some changes in the individual values of df_records
# and then write it back to a binary file
现在,我的问题是如何将其写回新文件。我在 NumPy 中找不到任何函数(在 Pandas 中也没有),它允许我准确指定要在每个字段中写入的字节。
Pandas 现在提供多种格式:
Format Type Data Description Reader Writer
text CSV read_csv to_csv
text JSON read_json to_json
text HTML read_html to_html
text Local clipboard read_clipboard to_clipboard
binary MS Excel read_excel to_excel
binary HDF5 Format read_hdf to_hdf
binary Feather Format read_feather to_feather
binary Parquet Format read_parquet to_parquet
binary Msgpack read_msgpack to_msgpack
binary Stata read_stata to_stata
binary SAS read_sas
binary Python Pickle Format read_pickle to_pickle
SQL SQL read_sql to_sql
SQL Google Big Query read_gbq to_gbq
对于中小型文件,我更喜欢 CSV,因为格式正确的 CSV 可以存储任意字符串数据,是人类可读的,并且在实现前两个目标的同时与任何格式一样简单。
不幸的是,对于更复杂的问题,选择更困难。
对于下载网络权重,如果提供“safetensor”格式,“我推荐”。 (您仍然需要信任加载安全张量的模型代码。)有关安全张量历史的更多信息,请参阅下面对 pickle 格式的讨论。
如果我在亚马逊AWS上,我会考虑使用镶木地板。 但是,我对这种格式没有任何经验。
我“不建议使用
tofile()
”。 tofile()
最适合快速文件存储,您不希望文件在数据可能具有不同字节序(大/小字节序)的不同机器上使用。
我“不再喜欢 HDF5 格式”。由于它“相当复杂”,因此长期归档存在严重风险。它有 150 页的规范,只有一个 300,000 行 C 实现。 我也可以“不再喜欢泡菜”格式。 尽管
pickle 格式声称具有长期稳定性,但它允许执行任意代码。即使 pickle 中实际上没有存储任何代码,所有 pickles 都会执行代码只是为了解开它们,这就是为什么 Huggingface 的人们首先推荐使用 pickle-tools 来扫描 pickle,然后使用 safetensor 作为 pickles 的替代品. 如果您对保存自己数据的稳定、安全的二进制格式有任何建议,请分享! 与此同时,我认为针对小数据的 CSV 以及在需要时节省磁盘空间或网络带宽的压缩 CSV 可能是最好的方法。 如果可能的话,我个人会尽量避免任何需要纯文本以上存储的 pandas 格式。
DataFrame
是视图还是副本,但假设它是副本,您可以使用
to_records
的 DataFrame
方法。这会返回一个记录数组,然后您可以使用
tofile
将其放入磁盘。
例如
df_records = pd.DataFrame(records)
# do some stuff
new_recarray = df_records.to_records()
new_recarray.tofile("myfile.npy")
数据将以打包字节的形式驻留在内存中,其格式由重组数据类型描述。