python struct 사용

10691 단어 python
python struct 모듈
주요 내용
 
간단하게 바 이 너 리 파일 읽 기:
 
# 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!
"
;
        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:
"
)

 
나중에 생각해 보 니 앞의 문법 은 좀 번 거 롭 습 니 다. 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:
"
)

좋은 웹페이지 즐겨찾기