SAS导出文件读取器

xport的Python项目详细描述


sas xport数据传输文件的python读取器(*.xpt)。

这是干什么的?

xport是一组United States government agencies用于发布数据集的二进制文件格式。很有意义 如果您试图重新读取IBM大型机上的数据文件 1988年。

官方的SAS specification for XPORT相对来说 直截了当。最困难的部分是转换ibm格式浮动 指向ieee格式,规范对此进行了详细说明。

sas v8及以上版本有一个update to the XPT specification。 此模块尚未更新以使用新版本。 但是,如果您使用的是sas v8+,则可能没有使用xpt 格式。对格式的更改似乎是对 元数据,但此模块当前的错误检查将引发 ParseError。如果你想更新V8引擎,请告诉我 submitting an issue

读取xpt

这个模块模仿标准库的csv模块, 提供ReaderDictReader类。请注意 xport.Reader是大写的,与csv.reader不同。

withopen('example.xpt','rb')asf:forrowinxport.Reader(f):printrow

行中的值将是Unicode字符串或浮点数,如下所示 由xpt文件元数据指定。注意,因为xpt文件在 一种不常见的二进制格式,应该使用模式'rb'打开它们。 为了方便起见,还可以使用NamedTupleReader获取 行作为namedtuple,数据集中的每个字段都有一个属性。

Reader对象有一些元数据属性:

  • Reader.fields–每个观察中字段的名称。
  • Reader.version–用于创建xpt文件的sas版本号。
  • Reader.os–用于创建xpt文件的操作系统。
  • Reader.created–创建xpt文件的日期和时间。
  • Reader.modified–上次修改xpt文件的日期和时间。

该模块还提供了一些实用函数来读取 整个xpt文件并将行加载到python数据结构中。 to_rows函数只返回一个行列表。这个 to_columns函数将以列的形式返回数据,而不是 排。列将是映射列标签的OrderedDict。 作为列值的字符串,作为字符串或浮点数的列表。 为了方便转换为NumPy数组或Pandas数据帧, 您可以使用to_numpyto_dataframe

withopen('example.xpt','rb')asf:columns=xport.to_columns(f)withopen('example.xpt','rb')asf:a=xport.to_numpy(f)withopen('example.xpt','rb')asf:df=xport.to_dataframe(f)

还可以使用xport模块作为命令行工具来转换xpt 文件到CSV(逗号分隔值)文件。:

$ python -m xport example.xpt > example.csv

如果要访问特定记录,应将行收集到 一个列表或使用itertoolsrecipes中的一个来快速消费和 扔掉不必要的元素。

# Collect all the records in a list for random accessrows=list(xport.Reader(f))# Select only record 42fromitertoolsimportislicerow=next(islice(xport.Reader(f),42,None))# Select only the last 42 recordsfromcollectionsimportdequerows=deque(xport.Reader(f),maxlen=42)

写入xpt

from_columns函数将从映射 标签(作为字符串)到列(作为iterable)或iterable of(label, 列)对。

# a mapping of labels to columnsmapping={'numbers':[1,3.14,42],'text':['life','universe','everything']}withopen('answers.xpt','wb')asf:xport.from_columns(mapping,f)

列标签限制为40个字符。列名是 限制为8个字符,将根据 列标签–前8个字符,非字母字符 替换为下划线,必要时填充为8个字符。全部 文本字符串(包括列标签)将转换为字节 使用ISO-8859-1编码。

不幸的是,编写xpt文件不能完全模拟csv 模块,因为在将任何行写入 正确写入xpt文件头。

from_rows函数需要一个iterable的iterable,如 元组列表。在这种情况下,列标签没有 指定并将自动分配为“x0”、“x1”、“x2”…, “xm”。

rows=[('a',1),('b',2)]withopen('example.xpt','wb')asf:xport.from_rows(rows,f)

要为from_rows指定列标签,每行可以是 将列标签的dict映射到该行的 价值观。每一行应该有相同的键。以行的形式传递 namedtuples,或具有^{tt29}的tuple的任何实例$ 属性,将列标签设置为 第一排。

^{p页r 7}$

功能请求

我很乐意修复bug,改进界面,或者制作模块 更快。只要submit an issue我就去看看。

最近的更改

  • 从带有模式标志的load/dump切换到to_rowsto_columnsfrom_rowsfrom_columns
  • Reader生成常规元组,而不是命名元组。

作者

2012年Jack Cushman之前的原始版本。 迈克尔·塞利克的主要修订版,2016年。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
ssl证书javax。网ssl。SSLHandshakeException:java。安全cert.CertificateException:没有与IP地址匹配的主题替代名称   基于组件的体系结构的java粒度   java在读取文件中的下一行和上一行时,我得到一个空指针异常   java是什么。StrutConfig。xml。strutsdia文件?   java中如何根据枚举字段对一组对象进行排序   java Firebase setPersistenceEnabled。导致大量内存使用   java奇数编译泛型类和列表错误   java类型org没有可用的源代码。石英克隆表达;您是否忘记继承所需的模块?   java如何使用map计算列表中整数列表的和,并获得一个新列表,其中每个条目对应于每个计算出的和?   java二进制搜索不会结束   java跳过Jackson中的错误JSON数据   在服务层中使用依赖项注入时引发java空指针异常。DAO类bean为空   访问者模式如何解释这两个Java程序运行时间的差异?   用Java扩展日历   java调用通用静态方法