2013-06-20 54 views
32

Đây là một yêu cầu hơi kỳ lạ nhưng tôi đang tìm cách viết một danh sách để gửi và sau đó đọc lại một số thời gian khác.Python 2.7 - Viết và đọc một danh sách từ tập tin

Tôi không có cách nào để làm lại danh sách để chúng được định dạng/định dạng đúng như ví dụ bên dưới.

danh sách của tôi có dữ liệu như sau:

test 
data 
here 
this 
is one 
group :) 

test 
data 
here 
this 
is another 
group :) 

Trả lời

92

Nếu bạn không cần nó để được người có thể đọc/chỉnh sửa, giải pháp đơn giản nhất là chỉ cần sử dụng pickle.

Để viết:

with open(the_filename, 'wb') as f: 
    pickle.dump(my_list, f) 

Để đọc:

with open(the_filename, 'rb') as f: 
    my_list = pickle.load(f) 

Nếu bạn làm cần họ là con người có thể đọc được, chúng ta cần biết thêm thông tin.

Nếu my_list là đảm bảo được một danh sách các chuỗi không có newlines nhúng, chỉ cần viết chúng trên mỗi dòng:

with open(the_filename, 'w') as f: 
    for s in my_list: 
     f.write(s + '\n') 

with open(the_filename, 'r') as f: 
    my_list = [line.rstrip('\n') for line in f] 

Nếu họ chuỗi Unicode chứ không phải là chuỗi byte, bạn sẽ muốn encode chúng. (Hoặc, tệ hơn, nếu chúng là chuỗi byte, nhưng không nhất thiết phải có cùng mã hóa như mặc định của hệ thống.)

Nếu chúng có thể có dòng mới hoặc ký tự không thể in, v.v., bạn có thể sử dụng thoát hoặc trích dẫn . Python có nhiều loại khác nhau của thoát được xây dựng vào stdlib.

Hãy sử dụng unicode-escape đây để giải quyết cả hai vấn đề trên cùng một lúc:

with open(the_filename, 'w') as f: 
    for s in my_list: 
     f.write((s + u'\n').encode('unicode-escape')) 

with open(the_filename, 'r') as f: 
    my_list = [line.decode('unicode-escape').rstrip(u'\n') for line in f] 

Bạn cũng có thể sử dụng giải pháp 3.x kiểu trong 2.x, với một trong hai mô-đun hoặc codecs các io module: *

import io 

with io.open(the_filename, 'w', encoding='unicode-escape') as f: 
    f.writelines(line + u'\n' for line in my_list) 

with open(the_filename, 'r') as f: 
    my_list = [line.rstrip(u'\n') for line in f] 

* TOOWTDI, vì vậy đó là một cách rõ ràng? Nó phụ thuộc ... Đối với phiên bản ngắn: nếu bạn cần làm việc với các phiên bản Python trước 2.6, hãy sử dụng codecs; nếu không, hãy sử dụng io.

+0

Tôi thích thư viện dưa, đó là khá ngọt ngào và hoạt động hoàn hảo.Tôi đã thực hiện nó và nó có vẻ là làm việc được. Cảm ơn bạn, tôi sẽ đánh dấu bạn là dấu chọn màu xanh lá cây ngay khi nó cho phép tôi. – Ryflex

+0

unicode-escape ... Tôi phải mở nó là 'wb' vì TypeError: phải là str, không phải byte – rluks

+0

@ Pan.student: Bạn đang sử dụng Python 3.x, phải không? Trong Python 2, câu hỏi này được đặt ra là gì, 'str' và' bytes' là cùng loại, và sự khác biệt giữa các tệp nhị phân và tệp văn bản chỉ là bản dịch mới. Trong Python 3, 'str' và' unicode' là cùng loại, và sự khác biệt giữa các tệp nhị phân và tệp văn bản là các tệp văn bản tự động mã hóa và giải mã cho bạn. (Bạn có thể nhận được hành vi 3.x nếu 2.x nếu bạn cẩn thận, bao gồm các tệp văn bản kiểu 3.x với 'io.open', nhưng người hỏi đã không làm điều đó.) – abarnert

12

Chừng nào tập tin của bạn có định dạng phù hợp (tức là dòng-chia), đây là cách dễ dàng với tập tin chỉ là cơ bản IO và chuỗi hoạt động:

with open('my_file.txt', 'rU') as in_file: 
    data = in_file.read().split('\n') 

Điều đó sẽ lưu trữ tập tin dữ liệu của bạn như một danh sách các mục , Một trên mỗi dòng. Để sau đó đặt nó vào một tệp, bạn sẽ làm điều ngược lại:

with open('new_file.txt', 'w') as out_file: 
    out_file.write('\n'.join(data)) # This will create a string with all of the items in data separated by new-line characters 

Hy vọng rằng phù hợp với những gì bạn đang tìm kiếm.

+0

+1. Nếu 'dữ liệu' mà chúng ta đang nói về không phức tạp, thì IMHO tốt hơn là cuộn trình phân tích cú pháp của riêng bạn như trong ans này. – brokenfoot