2013-07-22 29 views
13

Tôi có một máy ảo mà đọc hướng dẫn từ các bộ lồng nhau trong một danh sách như vậy:Chuyển đổi một danh sách để một chuỗi và trở lại

[(0,4738),(0,36), 
(0,6376),(0,0)] 

Khi lưu trữ loại chương trình mã máy, một file văn bản là dễ dàng nhất, và phải được viết dưới dạng một chuỗi. Điều này rõ ràng là khá khó để chuyển đổi trở lại.

Có mô-đun nào có thể đọc chuỗi vào danh sách/lưu trữ danh sách theo cách dễ đọc không?

yêu cầu:

  • Phải là con người có thể đọc được dưới hình thức lưu trữ (vì thế "dưa" là không phù hợp)
  • Phải là tương đối dễ dàng để thực hiện

Trả lời

11

JSON!

import json 

with open(data_file, 'wb') as dump: 
    dump.write(json.dumps(arbitrary_data)) 

và tương tự:

source = open(data_file, 'rb').read() 
data = json.loads(source) 
24

Sử dụng json module:

string = json.dumps(lst) 
lst = json.loads(string) 

Bản trình diễn:

>>> import json 
>>> lst = [(0,4738),(0,36), 
... (0,6376),(0,0)] 
>>> string = json.dumps(lst) 
>>> string 
'[[0, 4738], [0, 36], [0, 6376], [0, 0]]' 
>>> lst = json.loads(string) 
>>> lst 
[[0, 4738], [0, 36], [0, 6376], [0, 0]] 

Cách khác có thể là sử dụng repr()ast.literal_eval(); chỉ liệt kê, các bộ và các số nguyên mà còn cho phép bạn khứ hồi:

>>> from ast import literal_eval 
>>> string = repr(lst) 
>>> string 
'[[0, 4738], [0, 36], [0, 6376], [0, 0]]' 
>>> lst = literal_eval(string) 
>>> lst 
[[0, 4738], [0, 36], [0, 6376], [0, 0]] 

JSON có lợi thế nói thêm rằng nó là một định dạng tiêu chuẩn, với sự hỗ trợ từ các công cụ bên ngoài của Python hỗ trợ serialising, phân tích và xác nhận. Thư viện json cũng nhanh hơn rất nhiều so với chức năng ast.literal_eval().

+1

+1 cho liên kết đến tài liệu, cảm ơn! –

14

Chỉ cần sử dụng ast.literal_eval

>>> from ast import literal_eval 
>>> a = literal_eval('[(1, 2)]') 
>>> a 
[(1, 2)] 

Bạn có thể chuyển đổi nó thành một chuỗi sử dụng repr().

>>> repr(a) 
'[(1, 2)]' 
+0

Dang tôi đã làm chậm! – Serial

0

Nếu đây chỉ là hai bộ dữ liệu, bạn có thể lưu trữ chúng trong một file CVS sử dụng csv module. Không cần bất kỳ dấu ngoặc/dấu ngoặc đơn nào.

0
with open('path/to/file', 'w') as outfile: 
    for tup in L: 
     outfile.write("%s\n" %' '.join(str(i) for i in tup)) 

with open('path/to/file) as infile: 
    L = [tuple(int(i) for i in line.strip().split()) for line in infile] 
0

Nếu bạn chỉ cần đối phó với các loại Python nguyên thủy, bạn chỉ có thể sử dụng được xây dựng trong repr():

Help on built-in function repr in module __builtin__: 

repr(...) 
    repr(object) -> string 

    Return the canonical string representation of the object. 
    For most object types, eval(repr(object)) == object. 
5

eval nên làm điều đó một cách đơn giản:

>>> str([(0,4738),(0,36),(0,6376),(0,0)]) 
'[(0, 4738), (0, 36), (0, 6376), (0, 0)]' 

>>> eval(str([(0,4738),(0,36),(0,6376),(0,0)])) 
[(0, 4738), (0, 36), (0, 6376), (0, 0)] 
Các vấn đề liên quan