作用:

由于python可以辅助数据分析和数据挖掘,读取文件, 而savReaderWriter模块就是为此而设计。

官网 :http://pythonhosted.org/savReaderWriter/

读取文件

  1. with savReaderWriter.SavReader(filepath, ioUtf8=True) as read:
  2. # 如果不用ioutf8, 汉字十六进制\被转义,更麻烦
  3. for i in read:
            print i
  4.  
  5. 返回值:

# getsavfileinfo infomation :
# (self.numVars, self.nCases, self.varNames, self.varTypes,self.formats, self.varLabels, self.valueLabels)

读取文件头

  1. with savReaderWriter.SavReader(filepath, ioUtf8=True) as read:
  2. ret = read.getSavFileInfo()
  3. # return (self.numVars, self.nCases, self.varNames, self.varTypes,
  4. # self.formats, self.varLabels, self.valueLabels)
  5. # return read.formats, read.varNames, read.varLabels, read.valueLabels
  6. return ret[], ret[], ret[], ret[]

生成spss实例 ==注意valueLabels的值的key要是浮点型的

  1. import datetime
  2.  
  3. savFileName = '/opt/someFile.sav'
  4. varNames = [u'ID', u'StartTime', u'EndTime', u'VerNo', u'Q1', u'Q2', u'Q4']
  5. varTypes = {u'Q1': 0, u'Q2': 400, u'Q4': 400, u'StartTime': 0, u'VerNo': 0, u'EndTime': 0, u'ID': 20}
  6. varLabels = {u'Q1': u'\u5546\u8d85\u914d\u9001\u6536\u8d39\u6807\u51c6\u6b63\u786e\u7684\u662f', u'Q2': u'\u5546\u8d85\u4e0a\u7ebf\u6807\u51c6', u'Q4': u'\u672c\u6b21\u57f9\u8bad\u6536\u83b7\u548c\u610f\u89c1', u'StartTime': u'\u5f00\u59cb\u65f6\u95f4', u'VerNo': u'\u7248\u672c', u'EndTime': u'\u7ed3\u675f\u65f6\u95f4', u'ID': u'\u7528\u6237'}
  7. valueLabels = {'Q1': {1.0: u'\u4e13\u9001\u6536\u8d39', 2.0: u'\u5feb\u9001\u6536\u8d39'}, u'Q2': {}, u'Q4': {}, 'StartTime': {}, 'VerNo': {}, 'EndTime': {}, 'ID': {}}
  8. formats = {u'Q1': u'F5.0', u'VerNo': u'F5.0', u'EndTime': 'DATETIME40', u'StartTime': 'DATETIME40'}
  9. data = [[u'lKWmel1491380676', 13710788676.0, 13710788696.0, 1L, 1, u'\u725b\u820c', u'\u6e56\u516c\u56ed\u80e1\u5a77']]
  10. # 时间模块这样是错误的data = [[u'lKWmel1491380676', datetime.datetime(2016, 9, 21, 13, 42, 8), datetime.datetime(2016, 9, 21, 13, 42, 8), 1L, 1, u'\u725b\u820c', u'\u6e56\u516c\u56ed\u80e1\u5a77']]
  11. #
  12. # with SavWriter(savFileName, varNames, varTypes, varLabels=varLabels, columnWidths={}, ioUtf8=True) as writer:
  13. # writer.writerows(data)
  14. with SavWriter(savFileName=savFileName, varNames=varNames, varTypes=varTypes,
  15. varLabels=varLabels, valueLabels=valueLabels, ioUtf8=True, formats=formats,
  16. columnWidths={}) as writer:
  17.  
  18. writer.writerows(data)

错误总结:

1.

针对时间的更改

spss有自己的时间戳,为浮点型,与python的浮点型不一样,有差距,特别要注意

2.

读取文件时候,对文件里面时间改变成字符串类型

  1. with savReaderWriter.SavReader(filepath, ioUtf8=True) as read:
  2. # 如果不用ioutf8, 汉字十六进制\被转义,更麻烦
  3. my_time = my_datetime()
  4. for i in read:
  5. for j in range(len(valuetypes)):
  6. # 数据库不认unicode所以要转换下
  7. # 将varchar进行json存如数据库
  8. if valuetypes[j] == "DATETIME":
                # 注意区别 ,这个是python2.7使用的,因为python2.7取出来就是字符串,看看是不是unicode,如果是转一下就ok了
                # become_time = my_time.become_str(i[j])
                # i[j] = become_time
                
          
                #而这句呢,是3.5的区别,因为取出来是spss的时间戳类型,与python不同,需要转, 具体了解去看源码
  9. i[j] = read.spss2strDate(i[j], '%Y-%m-%d %H:%M:%S', None)

3.

写入的时候对时间的处理

  1. savFileName = '/opt/someFile.sav'
  2. with SavWriter(savFileName=savFileName, varNames=varNames, varTypes=varTypes,
  3. formats=formats, varLabels=varLabels, valueLabels=valueLabels,
  4. ioUtf8=True, columnWidths={}) as writer:
  5. for row_data in query_data:
  6. sub_li = []
  7. for i in range(len(my_columns_types)):
  8. sub_data = row_data[varNames[i]]
  9. if my_columns_types[i] == "VARCHAR":
  10. sub_li.append(json.loads(sub_data))
  11. elif my_columns_types[i] == "DATETIME":
  12. sub_li.append(writer.spssDateTime(b'%s' % sub_data, '%Y-%m-%d %H:%M:%S')) # 这句这句,在源码里面
  13.  
  14.          # 注意: python3的区别:aaa为字符串
             #sub_li.append(writer.spssDateTime(bytes(aaa, 'utf-8'), '%Y-%m-%d %H:%M:%S'))
            
  15. elif my_columns_types[i] == "DATE":
  16. sub_li.append(writer.spssDateTime(b'%s' % sub_data, '%Y-%m-%d'))
  17. else:
  18. sub_li.append(sub_data)
  19. data.append(sub_li)
  20.  
  21. writer.writerows(data)

4.

json对字典的处理,2.7与3.5不用,如果存入数据库的话,2.7需要pickle, 而3.5需要json

5

错误总结

通常一下错误的原因是因为头部数据信息和data数据不对称,数据列不对等造成的, 比如可能varname有10列,而数据只有5列, comlns

  1. Traceback (most recent call last):
  2. File "/opt/code/test_code/SpssMysql_and_SyntheticSpss/controllers/download_handler.py", line 92, in <module>
  3. varLabels=varLabels, ioUtf8=True) as writer:
  4. File "/usr/local/lib/python2.7/dist-packages/savReaderWriter/savWriter.py", line 220, in __init__
  5. self.varNamesTypes = self.varNames, self.varTypes
  6. File "/usr/local/lib/python2.7/dist-packages/savReaderWriter/header.py", line 200, in varNamesTypes
  7. checkErrsWarns(msg, retcode)
  8. File "/usr/local/lib/python2.7/dist-packages/savReaderWriter/error.py", line 120, in checkErrsWarns
  9. raise SPSSIOError(msg, retcode)
  10. savReaderWriter.error.SPSSIOError: Problem setting variable name 'ID' [SPSS_DUP_VAR]

6.

原因是列的名称不符合标准,字母数字下划线才ok

7. 'utf-8' codec can't decode bytes in position 48-49: unexpected end of data

意思是不能解码字节位置48-49:意料之外的数据

为什么, 因为spss数据出现了乱码, 在某一列,例如: spss进行了截取,这个时候就会出现乱码情况

  1. with savReaderWriter.SavReader(filepath) as read:
    # 这里的IOutf8 就不能等于True了, 只能用字节的形式, 然后下面针对字符进行处理, 去掉后两位
  2. # 如果不用ioutf8, 汉字十六进制\被转义,更麻烦
  3. dataList = []
  4. #  多条插入数据方式
  5. for i in read:
  6. for j in range(len(valuetypes)):
  7. # 数据库不认unicode所以要转换下
  8. # 将varchar进行json存如数据库
  9. if valuetypes[j] == "DATETIME":
  10. if i[j]:
  11. i[j] = read.spss2strDate(i[j], '%Y-%m-%d %H:%M:%S', None)
  12. # i[j] = read.spss2strDate(str(i[j], encoding='utf-8'), '%Y-%m-%d %H:%M:%S', None)
  13. elif valuetypes[j] == "DATE":
  14. if i[j]:
  15. i[j] = read.spss2strDate(i[j], '%Y-%m-%d', None)
  16. # i[j] = read.spss2strDate(str(i[j], encoding='utf-8'), '%Y-%m-%d', None)
  17. elif valuetypes[j] == "VARCHAR" or valuetypes[j] == "TEXT":
  18. try:
  19. i[j] = i[j].decode("utf-8")
  20. except:
  21. i[j] = i[j][:-].decode('utf-8')

savReaderWriter 模块的使用的更多相关文章

  1. 利用Python读取外部数据文件

      不论是数据分析,数据可视化,还是数据挖掘,一切的一切全都是以数据作为最基础的元素.利用Python进行数据分析,同样最重要的一步就是如何将数据导入到Python中,然后才可以实现后面的数据分析.数 ...

  2. npm 私有模块的管理使用

    你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便. 开始前的工作 你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 np ...

  3. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  4. ES6模块import细节

    写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ...

  5. Python标准模块--ContextManager

    1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...

  6. Python标准模块--Unicode

    1 模块简介 Python 3中最大的变化之一就是删除了Unicode类型.在Python 2中,有str类型和unicode类型,例如, Python 2.7.6 (default, Oct 26 ...

  7. Python标准模块--Iterators和Generators

    1 模块简介 当你开始使用Python编程时,你或许已经使用了iterators(迭代器)和generators(生成器),你当时可能并没有意识到.在本篇博文中,我们将会学习迭代器和生成器是什么.当然 ...

  8. 自己实现一个javascript事件模块

    nodejs中的事件模块 nodejs中有一个events模块,用来给别的函数对象提供绑定事件.触发事件的能力.这个别的函数的对象,我把它叫做事件宿主对象(非权威叫法),其原理是把宿主函数的原型链指向 ...

  9. 理解nodejs模块的scope

    描述 原文档地址:https://docs.npmjs.com/misc/scope 所有npm模块都有name,有的模块的name还有scope.scope的命名规则和name差不多,同样不能有ur ...

随机推荐

  1. 【Android】1.2 创建Android模拟器

    分类:C#.Android.VS2015:  创建日期:2016-01-20 调试手机应用程序一般先用模拟器来实现,只是因为每次都发布到手机上调试太麻烦了.当应用程序在模拟器上调试没错后,再发布到手机 ...

  2. (转)Unity3d使用心得(2):Unity3d 动态下载动画资源——AnimationClip 的使用 - 斯玛特琦

    引言: 在使用 Unity3d 开发微端.或者网页游戏的时候常常须要将资源打包成 AssetBundle ,然后通过 www 的方式动态的下载资源.今天要分享的是我再动态下载 Animation 骨骼 ...

  3. GPG key retrieval failed

    Total size: 340 k Installed size: 1.2 M Is this ok [y/N]: y Downloading Packages: warning: rpmts_Hdr ...

  4. at org.apache.catalina.webresources.CachedResource.validateResources

    "catalina-exec-659" #5239 daemon prio=5 os_prio=0 tid=0x00007fcba8099800 nid=0x581 waiting ...

  5. u3d中的坐标系

    任何子级游戏对象 (Child GameObject) 的检视器 (Inspector) 中的变换 (Transform) 值都会相对于父级 (Parent) 的变换 (Transform) 值而显示 ...

  6. [DIOCP3-说明书] 关于DEMO的编译

    总有些朋友问我,关于DEMO编译的一些问题,每次都回答大概都差不多,我想还是写篇说明书给大家,关于DEMO编译的步骤.   [环境设定] 1.将DIOCP3\source路径添加到Delphi的搜索路 ...

  7. 在CentOS6.5上安装/启动PostgreSQL

    CentOS install PostgreSQL yum install postgresql-server Start PostgreSQL service postgresql initdb # ...

  8. 多媒体文件格式之MKV

    [时间:2016-07] [状态:Open] MKV是一种开源的多媒体封装格式,是Matroska中应用比较多的格式之一.常见的后缀格式是.mkv(视频,包括音频和字幕)..mka(纯音频)..mks ...

  9. 利用jenkins的api来完成相关工作流程的自动化

    [本文出自天外归云的博客园] 背景 1. 实际工作中涉及到安卓客户端方面的测试,外推或运营部门经常会有很多的渠道,而每个渠道都对应着一个app的下载包,这些渠道都记录在安卓项目下的一个渠道列表文件中. ...

  10. 连接池(Connection Pool)技术

    解释: 连接池(Connection Pool)技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用.分配.管理策略,使得该连接池中的连接可以得到高效.安全的复用,避免了数据库连接频繁 ...