如何将大型 .sav 文件转换为 csv 文件
How to convert large .sav file into csv file
我正在尝试使用 Python 将一个大的 ~2GB SPSS (.SAV) 文件转换为 CSV。
如果文件大小 < 500MB,执行以下操作没有问题:
import pandas as pd
df = pd.read_spss('stdFile.sav')
df.to_csv("stdFile.csv", encoding = "utf-8-sig")
但在这种情况下,我遇到了 MemoryError...
我期待解决方案,不一定在 Python 中。但是我没有SPSS许可证,所以我必须用其他工具转换文件。
首先导入模块savReaderWriter将.sav文件转换为结构化数组然后导入模块numpy将结构化数组转换为csv:
pip install savReaderWriter
import savReaderWriter
import numpy as np
reader_np = savReaderWriter.SavReaderNp("stdFile.sav")
array = reader_np.to_structured_array("outfile.dat")
np.savetxt("stdFile.csv", array, delimiter=",")
reader_np.close()
您可以使用python的pyreadstat包来分块读取spss文件,并将每个块保存到csv中:
import pyreadstat
fpath = "path/to/stdFile.sav"
outpath = "stdFile.csv"
# chunksize determines how many rows to be read per chunk
reader = pyreadstat.read_file_in_chunks(pyreadstat.read_sav, fpath, chunksize= 10000)
cnt = 0
for df, meta in reader:
# if on the first iteration write otherwise append
if cnt>0:
wmode = "a"
header = False
else:
wmode = "w"
header = True
# write
df.to_csv(outpath, mode=wmode, header=header)
cnt+=1
更多信息在这里:https://github.com/Roche/pyreadstat#reading-rows-in-chunks
我正在尝试使用 Python 将一个大的 ~2GB SPSS (.SAV) 文件转换为 CSV。
如果文件大小 < 500MB,执行以下操作没有问题:
import pandas as pd
df = pd.read_spss('stdFile.sav')
df.to_csv("stdFile.csv", encoding = "utf-8-sig")
但在这种情况下,我遇到了 MemoryError...
我期待解决方案,不一定在 Python 中。但是我没有SPSS许可证,所以我必须用其他工具转换文件。
首先导入模块savReaderWriter将.sav文件转换为结构化数组然后导入模块numpy将结构化数组转换为csv:
pip install savReaderWriter
import savReaderWriter
import numpy as np
reader_np = savReaderWriter.SavReaderNp("stdFile.sav")
array = reader_np.to_structured_array("outfile.dat")
np.savetxt("stdFile.csv", array, delimiter=",")
reader_np.close()
您可以使用python的pyreadstat包来分块读取spss文件,并将每个块保存到csv中:
import pyreadstat
fpath = "path/to/stdFile.sav"
outpath = "stdFile.csv"
# chunksize determines how many rows to be read per chunk
reader = pyreadstat.read_file_in_chunks(pyreadstat.read_sav, fpath, chunksize= 10000)
cnt = 0
for df, meta in reader:
# if on the first iteration write otherwise append
if cnt>0:
wmode = "a"
header = False
else:
wmode = "w"
header = True
# write
df.to_csv(outpath, mode=wmode, header=header)
cnt+=1
更多信息在这里:https://github.com/Roche/pyreadstat#reading-rows-in-chunks