2010-03-29 23 views

Trả lời

26

Dữ liệu :: Dumper có hai mục đích chính: dữ liệu kiên trì và gỡ lỗi/kiểm tra đối tượng. Theo như tôi biết, không có bất cứ điều gì đó sẽ làm việc chính xác giống như dữ liệu :: Dumper.

Tôi sử dụng pickle để duy trì dữ liệu.

Tôi sử dụng pprint để kiểm tra trực quan đối tượng/gỡ lỗi của mình.

+3

Plus, một đơn giản " in "bằng Python một phần làm những gì dữ liệu :: Dumper không cho Perl. – EOL

3

Có thể có một vài lựa chọn thay thế: pickle, marshal, shelve.

+0

'marshal' gần như chắc chắn không phải là điều mọi người muốn. –

+0

Sử dụng kết hợp như thế này là tiện dụng (tất nhiên bạn phải biết yếu tố là một yếu tố của đối tượng): 'pprint (đối tượng) pprint (vars (đối tượng)) pprint (vars (object.element))' – gaoithe

4

Tôi nghĩ gần nhất bạn sẽ tìm thấy là mô-đun pprint.

>>> l = [1, 2, 3, 4] 
>>> l.append(l) 
>>> d = {1: l, 2: 'this is a string'} 
>>> print d 
{1: [1, 2, 3, 4, [...]], 2: 'this is a string'} 

>>> pprint.pprint(d) 
{1: [1, 2, 3, 4, <Recursion on list with id=47898714920216>], 
2: 'this is a string'} 
3
  • Đối serialization, có rất nhiều lựa chọn.

    • Một trong những điều tốt nhất là JSON, một tiêu chuẩn không thể hiểu được về ngôn ngữ để tuần tự hóa. Nó có sẵn ở mức 2.6 trong mô-đun st23.stdlib và trước đó với cùng một API trong mô-đun simplejson của bên thứ ba.

    • Bạn không muốn sử dụng marshal, mức độ này khá thấp. Nếu bạn muốn những gì nó cung cấp, bạn sẽ sử dụng dưa chua.

    • Tôi tránh sử dụng dưa chuột định dạng là chỉ Python và không an toàn. Deserializing sử dụng dưa chua có thể thực thi mã tùy ý.

      • Nếu bạn đã sử dụng pickle, bạn muốn sử dụng triển khai C của chúng. (Do import cPickle as pickle.)
  • Để gỡ lỗi, bạn thường muốn nhìn vào đối tượng của repr hoặc sử dụng các mô-đun pprint.

2

Tôi cũng đã sử dụng Data :: Dumper trong một thời gian và đã quen với cách hiển thị cấu trúc dữ liệu phức tạp được định dạng độc đáo. pprint như đã đề cập ở trên hiện một công việc khá phong nha, nhưng tôi không hoàn toàn thích phong cách định dạng của nó.Đó cộng pprint không cho phép bạn kiểm tra các đối tượng như Data :: Dumper không:

được tìm kiếm trên mạng và tình cờ gặp những:

https://gist.github.com/1071857#file_dumper.pyamazon

>>> y = { 1: [1,2,3], 2: [{'a':1},{'b':2}]} 

>>> pp = pprint.PrettyPrinter(indent = 4) 
>>> pp.pprint(y) 
{ 1: [1, 2, 3], 2: [{ 'a': 1}, { 'b': 2}]} 

>>> print(Dumper.dump(y)) # Dumper is the python module in the above link 
 
{ 
    1: [ 
     1 
     2 
     3 
    ] 
    2: [ 
     { 
      'a': 1 
     } 
     { 
      'b': 2 
     } 
    ] 
} 
>>> print(Dumper.dump(pp)) 
 
instance::pprint.PrettyPrinter 
    __dict__ :: { 
     '_depth': None 
     '_stream': file:: > 
     '_width': 80 
     '_indent_per_level': 4 
    } 

Cũng đáng kiểm tra là http://salmon-protocol.googlecode.com/svn-history/r24/trunk/salmon-playground/dumper.py Nó có phong cách riêng và có vẻ hữu ích.

3

Đây là một giải pháp đơn giản cho xuất dữ liệu lồng nhau tạo thành từ điển, danh sách, hoặc các tuple (nó hoạt động khá tốt đối với tôi):

def printStruct(struc, indent=0): 
    if isinstance(struc, dict): 
    print ' '*indent+'{' 
    for key,val in struc.iteritems(): 
     if isinstance(val, (dict, list, tuple)): 
     print ' '*(indent+1) + str(key) + '=> ' 
     printStruct(val, indent+2) 
     else: 
     print ' '*(indent+1) + str(key) + '=> ' + str(val) 
    print ' '*indent+'}' 
    elif isinstance(struc, list): 
    print ' '*indent + '[' 
    for item in struc: 
     printStruct(item, indent+1) 
    print ' '*indent + ']' 
    elif isinstance(struc, tuple): 
    print ' '*indent + '(' 
    for item in struc: 
     printStruct(item, indent+1) 
    print ' '*indent + ')' 
    else: print ' '*indent + str(struc) 

Xem nó tại nơi làm việc:

>>> d = [{'a1':1, 'a2':2, 'a3':3}, [1,2,3], [{'b1':1, 'b2':2}, {'c1':1}], 'd1', 'd2', 'd3'] 
>>> printStruct(d) 
[ 
    { 
    a1=> 1 
    a3=> 3 
    a2=> 2 
    } 
    [ 
    1 
    2 
    3 
    ] 
    [ 
    { 
     b1=> 1 
     b2=> 2 
    } 
    { 
     c1=> 1 
    } 
    ] 
    d1 
    d2 
    d3 
] 
+0

Hoàn hảo! Tôi chỉ cần cắt-n-dán này vào Dumper.py và sau đó nhập Dumper; in (Dumper.printStruct (dict_or_list)); #works, mặc dù tôi thay đổi printStruct thành dump. –

Các vấn đề liên quan