zoukankan      html  css  js  c++  java
  • python struct使用

    python struct模块

    主要内容来自转自:http://blog.163.com/sywxf@126/blog/static/50671196201011319507710/

    简单读一个二进制文件:

     
    # coding: utf-8
     
    import struct
    import sys
    binfile=open('test.bin','rb')
    buf = binfile.read()
    unpackIndex = 0
    a,b,c,d = struct.unpack_from('ifdh', buf, unpackIndex)
    print a, b, c, d
    unpackIndex += struct.calcsize('ifdh')

    此文件存储一个结构体

    struct abc{

    int a;

    float b;

    double c;

    short d;

    };

    c++代码为:

    // writeandreadbin.cpp : 定义控制台应用程序的入口点。
    //
     
    #include "stdafx.h"
     
     
    #include<fstream>
    #include <iostream>
    using namespace std;
    void main()
    {
        ofstream fwrite("test.bin", ios::out | ios::app | ios::binary);
        if(!fwrite){
            cout<<"File open error!\n";
            return;
        }
     
        int a = 0x12345678;
        float b = 3.25;
        double c = 4.33;
        short d = 0x2468;
        fwrite.write((char*)&a, sizeof(a));
        fwrite.write((char*)&b, sizeof(b));
        fwrite.write((char*)&c, sizeof(c));
        fwrite.write((char*)&d, sizeof(d));
     
        fwrite.close();
     
        ifstream fread("test.bin", ios::in|ios::binary);
        if(!fread)
        {
            cout<<"File open error!"<<endl;
            return;
        }
        fread.read((char*)&a, sizeof(a));
        fread.read((char*)&b, sizeof(b));
        fread.read((char*)&c, sizeof(c));
        fread.read((char*)&d, sizeof(d));
        fread.close();
     
        cout<<a<<endl;
        cout<<b<<endl;
        cout<<c<<endl;
        cout<<d<<endl;
    }

    python用以做一些简单的结构文件的读取还是很不错的,如下读取的二进制文件,显示出相关字段值:

    #!usr/bin/env python
    # coding: utf-8
    # read_codefilelist.py
     
    '''
    typedef struct SecuCodeNewFileItem
    {
        unsigned int    SecuCode;       // 证券代码
        unsigned char    SecuName[20];   // 证券名称,
        unsigned int    MarketType;     // 新市场类型
        signed char        Jianpin[8];
        float            PervClose;      // 昨收
        float            Last5AV;        // 过去5日平均每分钟成交量,用于计算量比
        float            Circulation;    // 流通盘
    }structSecuCodeNewFileItem;
    '''
    import struct
    import sys
     
    type = sys.getfilesystemencoding()
     
    binfile=open('codelist_pad.dat','rb')
    buf = binfile.read()
    unpackIndex = 0
    count = struct.unpack_from('i', buf, unpackIndex)
    unpackIndex += struct.calcsize('i')
    print 'count=', count[0]
     
    for i in range(0, count[0], 1):
        SecuCode,\
        SecuName,    \
        MarketType,  \
        Jianpin, \
        PervClose, \
        Last5AV, \
        Circulation = struct.unpack_from('i20si8sfff', buf, unpackIndex)
        
        print '%06d'%SecuCode, MarketType, \
              SecuName.decode(encoding='UTF-8', errors='ignore').rstrip('\000')
     
        unpackIndex += struct.calcsize('i20si8sfff')
        
     
    name = input("Please input any key to exit:\n")

    后来想了一下,前面的写法还是有点麻烦,用python目的就是为了快,前面的写法在需要改结构的时候,显得很不方便,以下更快一点:

    #!usr/bin/env python
    # coding: utf-8
    # read_codefilelist.py
     
    '''
    typedef struct SecuCodeNewFileItem
    {
        unsigned int    SecuCode;       // 证券代码
        unsigned char    SecuName[20];   // 证券名称,
        unsigned int    MarketType;     // 新市场类型
        signed char        Jianpin[8];
        float            PervClose;      // 昨收
        float            Last5AV;        // 过去5日平均每分钟成交量,用于计算量比
        float            Circulation;    // 流通盘
    }structSecuCodeNewFileItem;
    '''
    import struct
    import sys
     
    type = sys.getfilesystemencoding()
     
    binfile=open('codelist_pad.dat','rb')
    buf = binfile.read()
    unpackIndex = 0
    count = struct.unpack_from('i', buf, unpackIndex)
    unpackIndex += struct.calcsize('i')
    print 'count=', count[0]
     
    for i in range(0, count[0], 1):
        data = struct.unpack_from('i20si8sfff', buf, unpackIndex)
        print '%06d'%data[0], data[2],\
              data[1].decode(encoding='UTF-8', errors='ignore').rstrip('\000')
        
        unpackIndex += struct.calcsize('i20si8sfff')
        
        
    name = input("Please input any key to exit:\n")
  • 相关阅读:
    LeetCode 17. Letter Combinations of a Phone Number (电话号码的字母组合)
    Mordern Effective C++ --auto
    modern effective C++ -- Deducint Types
    基于锁的并发数据结构
    C++ 内存模型
    zlib 简单封装
    assert 实现分析
    Valgrind 快速入门
    kmp算法理解与记录
    make 要点简记
  • 原文地址:https://www.cnblogs.com/luhouxiang/p/2495171.html
Copyright © 2011-2022 走看看