要使用panda/pyreadstat读取spss .sav文件,可以用途:
df, meta = pyreadstat.read_sav()
要写入 Dataframe ,请用途:
pyreadstat.write_sav(df)
我怎样才能读,编辑和写一个.sav文件而不丢失任何 meta数据,像标签和其他可以在spss中更改的东西?如果这完全不可能,那么最接近于不丢失数据的方法是什么?
rbl8hiat1#
说话是廉价的,这里的代码。:-)
# 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())
部分解释:
这是必要的,因为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这些也许是你需要的。
from pyreadstat import metadata_container
2mbi3lxu2#
函数write_sav有很多参数来设置不同的元数据,例如column_labels、variable_value_labels等。当使用read_sav时,除了dataframe df之外,你还会得到一个元数据对象meta,你会在原始文件中找到许多这样的元数据片段。你可以编辑它们(或不编辑),然后将它们传递给write_sav不同的参数,以便设置元数据。话虽如此,可能不可能像在SPSS中那样设置每一块元数据,所以这是您所能得到的最接近的。请阅读文档,了解write_sav有哪些参数,以及读取read_sav时会获得哪些元数据。此文档还向您介绍了自述文件中解释如何设置不同元数据的位置,因此自述文件也是一个很好的信息来源。documentationreadme
2条答案
按热度按时间rbl8hiat1#
说话是廉价的,这里的代码。:-)
部分解释:
这是必要的,因为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这些也许是你需要的。
2mbi3lxu2#
函数write_sav有很多参数来设置不同的元数据,例如column_labels、variable_value_labels等。
当使用read_sav时,除了dataframe df之外,你还会得到一个元数据对象meta,你会在原始文件中找到许多这样的元数据片段。你可以编辑它们(或不编辑),然后将它们传递给write_sav不同的参数,以便设置元数据。
话虽如此,可能不可能像在SPSS中那样设置每一块元数据,所以这是您所能得到的最接近的。
请阅读文档,了解write_sav有哪些参数,以及读取read_sav时会获得哪些元数据。此文档还向您介绍了自述文件中解释如何设置不同元数据的位置,因此自述文件也是一个很好的信息来源。
documentationreadme