要使用 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())
一些解释:
SpssTool.get_legal_column_names
这是必需的,因为spss文件对列名有限制,详细信息请参阅官方文档:https://www.ibm.com/docs/en/spss-statistics/27.0.0?topic=view-variable-names
metadata_container
这是来自
。保存有关数据集信息的容器,您可以在以下位置找到更多详细信息:https://ofajardo.github.io/pyreadstat_documentation/_build/html/index.html#metadata-object-descriptionfrom pyreadstat import metadata_container
这些也许就是您所需要的。
函数 write_sav 有许多参数来设置不同的元数据,例如 column_labels、variable_value_labels 等。
使用 read_sav 时,除了数据帧 df 之外,您还将获得元数据对象元,您将在原始文件中找到许多元数据。您可以编辑(或不编辑)它们,然后将它们传递给 write_sav 不同的参数,以便设置元数据。
话虽如此,但可能无法像在 SPSS 中那样设置每一条元数据,因此这是您能得到的最接近的结果。
请阅读文档以了解 write_sav 有哪些参数,以及在读取 read_sav 时获得哪些元数据。本文档还向您指出了自述文件中解释如何设置不同元数据的位置,因此自述文件也是一个很好的信息来源。
您可以使用
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