2013-11-24 18 views
14

Giả sử tôi có một từ điển và tôi muốn viết nó vào một tập tin hiện có. Làm thế nào tôi có thể làm như vậy mà không mất bất cứ thứ gì có khả năng đã tồn tại trong tệp? Những gì tôi đã nghĩ đến là làm như sau:Cách viết từ điển vào một tệp hiện có?

def write_report(r, filename): 
     input_filename=open(filename, "a") 
     input_filename.close() 
     for (k,v) in r.items(): 
       input_filename.write(k,v) 
     return filename 

điều tôi muốn đảm bảo rằng tên tệp chính xác chứa từ điển.

+0

Về cùng một từ điển tồn tại trong tệp hoặc thêm từ điển vào tệp đã có nội dung khác? –

Trả lời

25

Bạn có thể sử dụng mô-đun json để đọc và ghi cấu trúc dữ liệu ở định dạng JSON (nói cách khác được tuần tự hóa thành JSON và deserialize từ JSON). Ví dụ:

import json 

# load from file: 
with open('/path/to/my_file.json', 'r') as f: 
    try: 
     data = json.load(f) 
    # if the file is empty the ValueError will be thrown 
    except ValueError: 
     data = {} 

# save to file: 
with open('/path/to/my_file.json', 'w') as f: 
    data['new_key'] = [1, 2, 3] 
    json.dump(data, f) 
+0

Điều đó có thể cần một số đồng bộ hóa để đảm bảo an toàn luồng :) – CodeReaper

+1

Chắc chắn nhưng đồng bộ hóa là một câu hỏi khác. :) –

+2

Đương nhiên, chỉ muốn làm cho OP biết vấn đề;) – CodeReaper

7

dưa có thể là một sự lựa chọn:

import pickle 

output = open('output.txt', 'ab+') 
data = {'a': [1, 2, 3],} 

pickle.dump(data, output) 
output.close() 

# read data 
output = open('output.txt', 'rb') 
obj_dict = pickle.load(output) # 'obj_dict' is a dict object 

Nhưng chỉ dữ liệu mà đã được xuất bản bởi dưa có thể được đọc bằng pickle.load. Vì vậy, nếu bạn muốn đọc tất cả dữ liệu từ tệp, bạn nên pickle.dump tất cả dữ liệu vào tệp.

+1

Câu hỏi được gắn thẻ python-3.3, trong đó 'import cPickle' là một ImportError (phiên bản tăng tốc được sử dụng tự động bởi' import pickle' bất cứ khi nào nó có sẵn) . – lvc

+0

@lvc, cảm ơn bạn đã nhắc và tôi sẽ sửa nó: D – flyer

0

Điều bạn đã thực hiện bằng cách sử dụng open(filename, "a") sử dụng chế độ nối thêm - gần như tất cả những gì bạn cần. Trong chế độ nối thêm, bạn sẽ không bao giờ ghi đè lên những gì đã có trong tệp. Vấn đề là nó không đảm bảo bạn là người duy nhất đang viết - và nếu bất kỳ bài viết nào có thể là một phần, chúng có thể bị cắt xén nếu có nhiều nhà văn làm việc trên cùng một tệp. Loại vấn đề đó có thể tránh được bằng cách sử dụng file locking.

Mã bạn đăng có một số vấn đề khác, tuy nhiên, chẳng hạn như đóng tệp trước khi ghi vào đó và thực tế là chỉ viết chấp nhận một đối số chuỗi. Bạn sẽ muốn tuần tự hóa dữ liệu thành các khối có thể quản lý được, mô-đun chuẩn của riêng Python là pickle (và shelve lưu trữ những thứ trong tệp cơ sở dữ liệu) và JSON là định dạng được hỗ trợ rộng rãi hơn.

2

Nếu bạn muốn thêm một đại diện văn bản của mỗi cặp khóa-giá trị trong từ điển vào một tập tin văn bản mà bạn có thể nhìn vào các phương pháp sau đây:

def write_report(r, filename): 
    input_file=open(filename, "a") 
    for k, v in r.items(): 
     line = '{}, {}'.format(k, v) 
     print(line, file=input_file)   
    input_file.close() 

Trên đây có thể được bày tỏ sạch hơn với với statment.

def write_report(r, filename):  
    with open(filename, "a") as input_file: 
     for k, v in r.items(): 
      line = '{}, {}'.format(k, v) 
      print(line, file=input_file) 
Các vấn đề liên quan