การเขียนพจนานุกรมลงในไฟล์ข้อความ?


94

ฉันมีพจนานุกรมและกำลังพยายามเขียนลงในไฟล์

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

ฉันมีข้อผิดพลาดแล้ว

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

ฉันจึงแก้ไขข้อผิดพลาดนั้น แต่มีข้อผิดพลาดอื่นเกิดขึ้น

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

ข้อผิดพลาด:

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

ฉันไม่รู้ว่าจะทำอย่างไรเพราะฉันยังเป็นมือใหม่ หากใครทราบวิธีแก้ไขปัญหาโปรดให้คำตอบ

หมายเหตุ: ฉันใช้ python 3 ไม่ใช่ python 2

คำตอบ:


152

ก่อนอื่นคุณกำลังเปิดไฟล์ในโหมดอ่านและพยายามเขียนลงในไฟล์ ปรึกษา - python โหมด IO

ประการที่สองคุณสามารถเขียนสตริงลงในไฟล์เท่านั้น หากคุณต้องการเขียนอ็อบเจ็กต์พจนานุกรมคุณต้องแปลงเป็นสตริงหรือทำให้เป็นอนุกรม

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

ในกรณีของการทำให้เป็นอนุกรม

import cPickle as pickle

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

สำหรับการนำเข้าแพ็คเกจ python 3.x pickle จะแตกต่างกัน

import _pickle as pickle

1
ได้ผล! แม้ว่าจะเขียนเฉพาะเนื้อหาของพจนานุกรมเท่านั้น ช่วยเขียนได้ไหม: exDict = {111: 111, 222: 222}
Nic

ฉันคิดอย่างนั้น แต่คิดว่ามีวิธีที่ดีกว่า มันใช้งานได้ดีขอบคุณมาก!
Nic

หากคุณไม่ได้ติด=ป้ายมากเกินไปการแก้ไขที่ฉันได้ทำไว้อาจได้ผล
hspandher

วิธีที่คุณเคยมีมาก่อน: file.write ('exDict =' + json.dumps (exDict)) ทำงานได้ดีสำหรับฉันเพราะฉันกำลังใช้อยู่ตอนนี้
Nic

1
@JanKukacka JSON เป็นรูปแบบข้อมูลมาตรฐาน สิ่งที่str(exDict)จะสร้างจะไม่ใช่ JSON ที่ถูกต้องเสมอไป เหตุผลหนึ่งจากด้านหลังของหัวของฉันคือเครื่องหมายคำพูดเดี่ยวไม่ถูกต้องในไฟล์ JSON ในขณะที่อาจมีอยู่เมื่อเราใช้strวิธีการ
hspandher

50

ฉันทำแบบนี้ใน python 3:

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

1
ฉันชอบอันนี้เพราะไม่จำเป็นต้องนำเข้า คำตอบเพิ่มเติมข้างต้น data.write (str (พจนานุกรม)) จะใช้ไม่ได้กับพจนานุกรมที่ถูกต้องเนื่องจากจะเขียน <class 'dict'> ในไฟล์ของคุณ
Si Mon

สิ่งหนึ่งที่ฉันอยากรู้คือทำไมไม่พิมพ์ (mydictionary, file = open ('myfile.txt', 'w'))
MadmanLee

@MadmanLee ฉันคิดว่าทั้งคู่ก็โอเคและมันเป็นเรื่องของการที่เราชอบรหัสของเรา
NKSHELL

1
โดยเปิด ('myfile.txt', 'r') เป็น f: content = f.read (); dic = eval (เนื้อหา);
NKSHELL

เหตุผลที่ json ดีกว่าแค่เขียนstr(mydict)ลงไฟล์ก็คือคุณไม่จำเป็นต้องevalใช้เนื้อหาเพื่อรับdictวัตถุกลับมา evalเป็นระบบรักษาความปลอดภัยและไม่ควรใช้หากมีตัวเลือกที่ดีกว่านี้
snakecharmerb

23
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
คำตอบแบบใช้รหัสเท่านั้นไม่ได้รับการสนับสนุนเนื่องจากไม่ได้อธิบายถึงวิธีการแก้ปัญหา โปรดอัปเดตคำตอบของคุณเพื่ออธิบายว่าสิ่งนี้จะช่วยปรับปรุงคำตอบอื่น ๆ ที่ได้รับการยอมรับและได้รับการโหวตแล้วได้อย่างไร โปรดตรวจสอบฉันจะเขียนคำตอบที่ดีได้อย่างไร
FluffyKitten

นอกจากนี้คุณควรใช้withคำสั่งเมื่ออ่านและเขียนไปยังไฟล์: stackoverflow.com/questions/3012488/…
Falko

13

คำสั่งที่มีบล็อกรหัสแรกของคุณคือคุณกำลังเปิดไฟล์เป็น 'r' แม้ว่าคุณจะต้องการเขียนโดยใช้ 'w'

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

นี่คือคำตอบที่ถูกต้องเนื่องจากรหัสในคำถามมีข้อผิดพลาด
Ricardo Rivaldo

เมื่อฉันลองเส้นทาง json ฉันได้รับความล้มเหลวเนื่องจากฉันมีค่า "NaN" ในการลอย ไม่มีการแก้ไขโดยไม่ทำให้ข้อมูลเสียหายหากคุณต้องการเขียน JSON ดังนั้นคำตอบนี้จึงเป็นคำตอบที่ต้องการเนื่องจากสามารถบันทึกไฟล์ข้อความเพื่อให้สะท้อนถึงคำสั่งได้อย่างถูกต้อง
pauljohn32

7

หากคุณต้องการพจนานุกรมคุณสามารถนำเข้าจากไฟล์ตามชื่อและยังเพิ่มรายการที่เรียงลำดับอย่างสวยงามและมีสตริงที่คุณต้องการเก็บรักษาคุณสามารถลองทำสิ่งนี้:

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("}")

จากนั้นนำเข้า:

from file import dictionary_name

ใช้ได้กับสตริงเท่านั้นไม่ใช่ประเภทอื่นในพจนานุกรม
Paul Kenjora

4

สำหรับผู้ชื่นชอบความเข้าใจรายการสิ่งนี้จะเขียนkey : valueคู่ทั้งหมดในบรรทัดใหม่ในdog.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

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันก็คิดที่จะแบ่งปันวิธีแก้ปัญหาที่ไม่เกี่ยวข้องกับ json โดยส่วนตัวฉันไม่ค่อยชอบ json เพราะมันไม่อนุญาตให้ต่อท้ายข้อมูลได้ง่ายๆ หากจุดเริ่มต้นของคุณคือพจนานุกรมขั้นแรกคุณสามารถแปลงเป็น dataframe จากนั้นต่อท้ายเข้ากับไฟล์ txt ของคุณ:

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')

ฉันหวังว่านี่จะช่วยได้


1
ทำไมต้องใช้ไลบรารีภายนอกสำหรับงานง่ายๆ Python Simple เป็นหลักการที่ดีกว่า
Ricardo Rivaldo

ไม่มีประโยชน์มากนักเนื่องจากพจนานุกรมส่วนใหญ่ที่ฉันใช้ไม่ง่ายพอที่จะกลายเป็นวัตถุ DataFrame ที่มีประโยชน์
pauljohn32



-2
import json

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

คุณสามารถปรับปรุงข้อผิดพลาดนี้ได้โดยเพิ่มคำอธิบายว่าเหตุใดจึงได้ผล
Greg the
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.