2015-11-19 54 views
2

我正在使用struct来格式化一个固定分隔的txt文件。这是前两行:错误:unpack_from需要一个缓冲区

Sat Jan 3 18:15:05 2009 62e907b15cbf27d5425399ebf6f0fb50ebb88f18 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b +    50.00000000 
    Fri Jan 9 02:54:25 2009 119b098e2e980a229e139a9ed01a469e518e6f26 0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098 +    50.00000000 

并使用下面的代码将其转换成CSV:

import csv 
import struct 

fieldwidths = (-4, 24, -4, 40,-4,64,-1,1,25) # negative widths represent ignored padding fields 
fmtstring = ' '.join('{}{}'.format(abs(fw), 'x' if fw < 0 else 's') 
         for fw in fieldwidths) 
fieldstruct = struct.Struct(fmtstring) 
parse = fieldstruct.unpack_from 

c = csv.writer(open("/home/ulrich/Desktop/disertation/sample_parsed_blch1.csv", "wb")) 
with open('/home/ulrich/Desktop/disertation/sample_parsed_blch2.txt') as f: 
    for line in f: 
     fields = parse(line) 
     c.writerow(fields) 

它工作正常,因为它产生的CSV但我仍然收到此错误信息:

error: unpack_from requires a buffer of at least 167 bytes 
+1

你找到csv文件中的所有行?如果是的话,你可以在文件末尾添加一个额外的字符,将其作为最后一个空行读取。一些Windows编辑器已知添加Ctrl-Z与CP-M兼容(有些恐龙可以记住这个...) –

+0

这是它Serge,在文件末尾有一个空行/换行符 – ulrich

回答

1

这种错误可能是由文件末尾的额外字符引起的。已知Windows世界中的一些编辑者在文本文件的末尾添加了一个Ctrl-Z。这是MS/DOS希望与CP/M保持兼容性的时候的回忆。

你可以很容易地通过跳过较短线摆脱它:

for line in f: 
    if len(line) >= minsize # 100 
     fields = parse(line) 
     c.writerow(fields) 
0

如果迭代文件,line将contian尾随换行符。您需要删除:

.... 
for line in f: 
    fields = parse(line.rstrip('\r\n')) 
    c.writerow(fields) 
0

我结束了,为了增加与正则表达式的条件只能用适当的格式解析行

import csv 
import struct 
import re 
pattern = re.compile("\s{4}\w{3}\s{1}.+") 


fieldwidths = (-4, 24, -4, 40,-4,64,-1,1,25) # negative widths represent ignored padding fields 
fmtstring = ' '.join('{}{}'.format(abs(fw), 'x' if fw < 0 else 's') 
         for fw in fieldwidths) 
fieldstruct = struct.Struct(fmtstring) 
parse = fieldstruct.unpack_from 

c = csv.writer(open("/media/ulrich/FC9A-C444/all_tx.csv", "wb")) 
with open('/media/ulrich/FC9A-C444/all_tx.txt') as f: 
    for line in f: 
     if pattern.match(line): 
      fields = parse(line) 
      c.writerow(fields) 
相关问题