pyreadstat读写SPSS数据不丢失



要使用pandas/pyreadstat读取spss .sav文件,可以使用:

df, meta = pyreadstat.read_sav()

要写一个数据框架,你可以使用:

pyreadstat.write_sav(df)

如何读取,编辑和编写。sav文件而不丢失任何元数据,如标签和其他可以在spss中更改的东西?

如果这是不可能的完全,什么是最接近不丢失数据的方式?

空谈很便宜,下面是代码。: -)

# using pyreadstat
from pyreadstat import write_sav
class TempFile(type(pathlib.Path())):  # type: ignore
def __exit__(self, exc_type, exc_val, exc_tb):
filepath = str(self.absolute())
try:
os.remove(filepath)
except OSError:
logger.exception('romve temporary file: %s failed!', filepath)
self._closed = True
class SpssTool:
@classmethod
def to_spss(cls, df: DataFrame, io: BytesIO, metadata: metadata_container, *, compress: bool = False):
"""Writes a pandas dataframe to a BytesIO object.
Parameters
----------
df : pandas.DataFrame
pandas data frame to write to sav or zsav
io : BytesIO
the buffer to save spss file
metadata: metadata_container
spss file meta data container
compress : bool
whether compress to zsav.
"""
df.columns = SpssTool.get_legal_column_names(df.columns.to_list())
with TempFile(f'/tmp/{uuid4().hex}.{"zsav" if compress else "sav"}') as fp:
write_sav(
df=df,
dst_path=fp,
column_labels=metadata.column_labels if metadata else None,
variable_value_labels=dict(metadata.variable_value_labels) if metadata else {},
variable_measure=metadata.variable_measure if metadata else None,
)
io.write(fp.read_bytes())

一些expalinations:

  • SpssTool.get_legal_column_names

因为spss文件对列名有限制,所以需要这样做,详见官方文档:https://www.ibm.com/docs/en/spss-statistics/27.0.0?topic=view-variable-names

  • metadata_container

这是来自from pyreadstat import metadata_container。保存数据集信息的容器,您可以在:https://ofajardo.github.io/pyreadstat_documentation/_build/html/index.html#metadata-object-description

中找到更多详细信息。

这些也许是你需要的。

write_sav函数有许多参数来设置不同的元数据,例如column_labels, variable_value_labels等。

当使用read_sav时,除了数据帧df(一个元数据对象meta)之外,还可以在原始文件中找到许多这样的元数据块。您可以编辑(或不编辑)它们,然后将它们传递给write_sav不同的参数,以便设置元数据。

话虽如此,可能不可能像在SPSS中那样设置每一块元数据,所以这是你能得到的最接近的。

请阅读文档,了解write_sav有哪些参数,以及读取read_sav时会得到哪些元数据。本文档还为您指出了README中解释如何设置不同元数据块的地方,因此README也是一个很好的信息来源。

文档自述文件

最新更新