Ghi từ điển vào tệp văn bản?


87

Tôi có một từ điển và đang cố gắng ghi nó vào một tệp.

exDict = {1:1, 2:2, 3:3}
with open('file.txt', 'r') as file:
    file.write(exDict)

Sau đó tôi có lỗi

file.write(exDict)
TypeError: must be str, not dict

Vì vậy, tôi đã sửa lỗi đó nhưng một lỗi khác đến

exDict = {111:111, 222:222}
with open('file.txt', 'r') as file:
    file.write(str(exDict))

Lỗi:

file.write(str(exDict))
io.UnsupportedOperation: not writable

Tôi không biết phải làm gì vì tôi vẫn là người mới bắt đầu chơi python. Nếu ai biết cách giải quyết vấn đề, vui lòng cung cấp câu trả lời.

LƯU Ý: Tôi đang sử dụng python 3, không phải python 2

Câu trả lời:


145

Trước hết, bạn đang mở tệp ở chế độ đọc và cố gắng ghi vào đó. Tham khảo - Python chế độ IO

Thứ hai, bạn chỉ có thể ghi một chuỗi vào một tệp. Nếu bạn muốn viết một đối tượng từ điển, bạn cần phải chuyển đổi nó thành chuỗi hoặc tuần tự hóa nó.

import json

# as requested in comment
exDict = {'exDict': exDict}

with open('file.txt', 'w') as file:
     file.write(json.dumps(exDict)) # use `json.loads` to do the reverse

Trong trường hợp tuần tự

import cPickle as pickle

with open('file.txt', 'w') as file:
     file.write(pickle.dumps(exDict)) # use `pickle.loads` to do the reverse

Đối với nhập gói dưa chua python 3.x sẽ khác

import _pickle as pickle

1
Điều đó đã hiệu quả! Mặc dù, nó chỉ viết nội dung của từ điển. Bạn có thể lấy nó để viết không: exDict = {111: 111, 222: 222}
Nic

Tôi nghĩ đến điều đó nhưng nghĩ rằng có một cách tốt hơn. Nó hoạt động mặc dù vậy cảm ơn bạn!
Nic

Nếu bạn không quá gắn bó với =dấu hiệu, bản chỉnh sửa tôi đã thực hiện có thể thực hiện công việc.
hspandher

Cách bạn có trước đây: file.write ('exDict =' + json.dumps (exDict)) đã hoạt động tốt đối với tôi vì tôi đang sử dụng nó ngay bây giờ.
Nic

1
@JanKukacka JSON là một định dạng dữ liệu tiêu chuẩn. Những gì str(exDict)sẽ tạo ra không phải lúc nào cũng là một JSON hợp lệ. Một lý do từ phía sau đầu của tôi là các dấu ngoặc kép không hợp lệ trong tệp JSON, trong khi có thể xuất hiện khi chúng ta sử dụng strphương thức.
hspandher

49

Tôi làm điều đó như thế này trong python 3:

with open('myfile.txt', 'w') as f:
    print(mydictionary, file=f)

1
Tôi thích cái này vì không cần nhập khẩu. Câu trả lời ở trên data.write (str (từ điển)) sẽ không hoạt động với một từ điển chính xác vì nó sẽ chỉ viết <class 'dict'> trong tệp của bạn
Si Mon

Một điều tôi cũng tò mò là tại sao không chỉ in (mydictionary, file = open ('myfile.txt', 'w'))
MadmanLee

@MadmanLee Tôi nghĩ cả hai đều ổn và vấn đề là chúng ta thích mã của mình trông như thế nào.
NKSHELL

1
với open ('myfile.txt', 'r') là f: content = f.read (); dic = eval (nội dung);
NKSHELL

Lý do tại sao json tốt hơn là chỉ ghi str(mydict)vào một tệp chính xác là bạn không cần evalnội dung để lấy dictlại đối tượng. evallà một rosk bảo mật và không nên được sử dụng nếu có các tùy chọn tốt hơn.
snakecharmerb

22
fout = "/your/outfile/here.txt"
fo = open(fout, "w")

for k, v in yourDictionary.items():
    fo.write(str(k) + ' >>> '+ str(v) + '\n\n')

fo.close()

12
Câu trả lời chỉ có mã không được khuyến khích vì chúng không giải thích cách chúng giải quyết vấn đề. Vui lòng cập nhật câu trả lời của bạn để giải thích cách điều này cải thiện so với các câu trả lời được chấp nhận và ủng hộ khác mà câu hỏi này đã có. Vui lòng xem lại Cách viết câu trả lời hay .
FluffyKitten

Ngoài ra, bạn nên sử dụng các withtuyên bố khi đọc và ghi các file: stackoverflow.com/questions/3012488/...
Falko

13

Thăm dò với khối mã đầu tiên của bạn là bạn đang mở tệp bằng 'r' mặc dù bạn muốn ghi vào nó bằng 'w'

with open('/Users/your/path/foo','w') as data:
    data.write(str(dictionary))

đây là câu trả lời chính xác, vì mã trong câu hỏi có lỗi.
Ricardo Rivaldo

Khi tôi thử tuyến đường json, tôi gặp lỗi vì tôi có một số giá trị "NaN" trong phao. Không có cách sửa chữa nào mà không làm hỏng chính dữ liệu nếu bạn muốn viết JSON. Do đó, câu trả lời này là câu trả lời được ưa thích hơn vì nó có thể lưu một tệp văn bản để phản ánh chính xác câu chính tả.
pauljohn32

7

Nếu bạn muốn có một từ điển, bạn có thể nhập từ một tệp theo tên và cũng có thể thêm các mục nhập được sắp xếp độc đáo và chứa các chuỗi bạn muốn giữ lại, bạn có thể thử cách này:

data = {'A': 'a', 'B': 'b', }

with open('file.py','w') as file:
    file.write("dictionary_name = { \n")
    for k in sorted (data.keys()):
        file.write("'%s':'%s', \n" % (k, data[k]))
    file.write("}")

Sau đó, để nhập:

from file import dictionary_name

Điều này chỉ hoạt động cho các chuỗi, không phải các loại khác trong từ điển.
Paul Kenjora

4

Đối với những người yêu thích khả năng hiểu danh sách, điều này sẽ viết tất cả các key : valuecặp trong các dòng mới trongdog.txt

my_dict = {'foo': [1,2], 'bar':[3,4]}

# create list of strings
list_of_strings = [ f'{key} : {my_dict[key]}' for key in my_dict ]

# write string one by one adding newline
with open('dog.txt', 'w') as my_file:
    [ my_file.write(f'{st}\n') for st in list_of_strings ]

1

Tôi biết đây là một câu hỏi cũ nhưng tôi cũng nghĩ để chia sẻ một giải pháp không liên quan đến json. Cá nhân tôi không hoàn toàn thích json vì nó không cho phép dễ dàng nối thêm dữ liệu. Nếu điểm xuất phát của bạn là từ điển, trước tiên bạn có thể chuyển đổi nó thành khung dữ liệu và sau đó nối nó vào tệp txt của bạn:

import pandas as pd
one_line_dict = exDict = {1:1, 2:2, 3:3}
df = pd.DataFrame.from_dict([one_line_dict])
df.to_csv('file.txt', header=False, index=True, mode='a')

Tôi hy vọng điều này có thể giúp ích.


1
tại sao sử dụng thư viện bên ngoài cho một nhiệm vụ đơn giản? Python Simple là nguyên tắc tốt hơn.
Ricardo Rivaldo

Không hữu ích lắm vì hầu hết các từ điển tôi sử dụng không đủ đơn giản để trở thành đối tượng DataFrame hữu ích.
pauljohn32

1
exDict = {1:1, 2:2, 3:3}
with open('file.txt', 'w+') as file:
    file.write(str(exDict))


-2
import json

with open('tokenler.json', 'w') as file:
     file.write(json.dumps(mydict, ensure_ascii=False))

Bạn có thể cải thiện lỗi này bằng cách thêm giải thích tại sao nó hoạt động.
Greg the Incredulous
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.