pyreadstat读写spss不丢失数据

问题描述 投票:0回答:3

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

df, meta = pyreadstat.read_sav()

要编写数据框,请使用:

pyreadstat.write_sav(df)

如何读取、编辑和写入 .sav 文件而不丢失任何元数据,例如标签和其他可以在 spss 中更改的内容?

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

python pandas dataframe spss
3个回答
2
投票

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

# 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())

一些解释

  • 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

这些也许就是您所需要的。


0
投票

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

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

话虽如此,但可能无法像在 SPSS 中那样设置每一条元数据,因此这是您能得到的最接近的结果。

请阅读文档以了解 write_sav 有哪些参数,以及在读取 read_sav 时获得哪些元数据。本文档还向您指出了自述文件中解释如何设置不同元数据的位置,因此自述文件也是一个很好的信息来源。

文档 自述文件


0
投票

您可以使用

pyreadstat
代替
pyspssio

如果您是第一次使用此库,您可能需要安装它:

pip install pyspssio

要读取数据,您可以使用与 pyreadstat 类似的语法:

import pyspssio
df, meta = pyspssio.read_sav("C:/my_doc.sav")

要导出元数据,请使用metadata=...参数:

pyspssio.write_sav("C:/my_doc v2.sav",df,metadata=meta)

您可以在这里找到更多详细信息: https://pyspssio.readthedocs.io/en/stable/readme.html

© www.soinside.com 2019 - 2024. All rights reserved.