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模块, 提供Reader和DictReader类。请注意 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_numpy和to_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_rows, to_columns、from_rows和from_columns。
- Reader生成常规元组,而不是命名元组。