Bir metin dosyasına sözlük mi yazıyorsunuz?


94

Bir sözlüğüm var ve onu bir dosyaya yazmaya çalışıyorum.

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

O zaman hata bende

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

Bu yüzden bu hatayı düzelttim ama başka bir hata geldi

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

Hata:

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

Python'da hala acemi olduğum için ne yapacağım hakkında hiçbir fikrim yok. Sorunun nasıl çözüleceğini bilen biri varsa, lütfen yanıt verin.

NOT: Ben python 2 değil, python 3 kullanıyorum

Yanıtlar:


152

Öncelikle dosyayı okuma modunda açıyorsunuz ve içine yazmaya çalışıyorsunuz. Danışma - IO modları python

İkinci olarak, bir dosyaya yalnızca bir dizge yazabilirsiniz. Bir sözlük nesnesi yazmak istiyorsanız, onu dizeye dönüştürmeniz veya serileştirmeniz gerekir.

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

Serileştirme durumunda

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 için turşu paketi içe aktarma işlemi farklı olacaktır

import _pickle as pickle

1
İşe yaradı! Bununla birlikte, yalnızca sözlüğün içeriğini yazar. Yazmasını sağlayabilir misin: exDict = {111: 111, 222: 222}
Nic

Bunu düşündüm ama daha iyi bir yol olduğunu düşündüm. Yine de işe yarıyor, çok teşekkür ederim!
Nic

İşarete fazla bağlı değilseniz, =yaptığım düzenleme işi yapabilir.
hspandher

Daha önce sahip olduğunuz yol: file.write ('exDict =' + json.dumps (exDict)) şu anda kullandığım için benim için iyi çalıştı.
Nic

1
@JanKukacka JSON standart bir veri formatıdır. Ne str(exDict)üretecek her zaman geçerli bir JSON olmayacaktır. Aklımın arkasından bir neden, tek tırnakların bir JSON dosyasında geçerli olmaması, ancak stryöntemi kullandığımızda mevcut olabilmesidir .
hspandher

50

Bunu python 3'te böyle yapıyorum:

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

1
Bunu beğendim çünkü ithalat gerekli değil. Data.write (str (sözlük)) üzerindeki yanıt, dosyanıza sadece <class 'dict'> yazacağı için doğru bir sözlükle çalışmayacaktır
Si Pzt

Merak ettiğim bir şey de neden sadece yazdırmadığım (mydictionary, file = open ('myfile.txt', 'w'))
MadmanLee

@MadmanLee Her ikisinin de iyi olduğunu düşünüyorum ve kodumuzun nasıl göründüğüne bağlı.
NKSHELL

1
f olarak open ('myfile.txt', 'r') ile: content = f.read (); dic = eval (içerik);
NKSHELL

Json'un str(mydict)bir dosyaya yazmaktan daha iyi olmasının nedeni eval, dictnesneyi geri almak için içeriğe ihtiyaç duymamanızdır. evalbir güvenlik rozetidir ve daha iyi seçenekler varsa kullanılmamalıdır.
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
Yalnızca kod yanıtları, sorunu nasıl çözdüklerini açıklamadıkları için önerilmez. Lütfen yanıtınızı, bu sorunun halihazırda sahip olduğu diğer kabul edilen ve olumlu oylanan yanıtlarda nasıl geliştiğini açıklamak için güncelleyin. Lütfen inceleyin Nasıl iyi bir cevap yazabilirim .
FluffyKitten

Ayrıca, withdosyalardan okurken ve dosyalara yazarken de şu ifadeyi kullanmalısınız : stackoverflow.com/questions/3012488/…
Falko

13

İlk kod bloğunuzla ilgili sorun, dosyaya yazmak istemenize rağmen dosyayı 'r' olarak açmanızdı. 'w'

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

soru içindeki kodda bir hata olduğu için bu doğru cevaptır.
Ricardo Rivaldo

Json rotasını denediğimde başarısız oluyorum çünkü float'larda bazı "NaN" değerlerim var. JSON yazmak istiyorsanız verinin kendisine zarar vermeden düzeltme yapılamaz. Bu nedenle, dikteyi doğru şekilde yansıtmak için bir metin dosyası kaydedebildiği için bu cevap tercih edilir.
pauljohn32

7

Bir dosyadan isme göre içe aktarabileceğiniz bir sözlük istiyorsanız ve bu da güzel bir şekilde sıralanmış ve korumak istediğiniz dizeleri içeren girişler ekler, şunu deneyebilirsiniz:

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

Ardından içe aktarmak için:

from file import dictionary_name

Bu yalnızca dizeler için işe yarar, sözlükteki diğer türler için geçerli değildir.
Paul Kenjora

4

Listeyi anlamayı sevenler için bu, tüm key : valueçiftleri yeni satırlara yazacaktır .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

Bunun eski bir soru olduğunu biliyorum ama json içermeyen bir çözümü de paylaşmayı düşündüm. Kişisel olarak json'dan pek hoşlanmıyorum çünkü verileri kolayca eklemeye izin vermiyor. Başlangıç ​​noktanız bir sözlükse, önce onu bir veri çerçevesine dönüştürebilir ve ardından txt dosyanıza ekleyebilirsiniz:

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

Umarım bu yardımcı olabilir.


1
neden basit bir görev için harici bir kitaplık kullanmalı? Python Simple daha iyi bir prensiptir.
Ricardo Rivaldo

Çok kullanışlı değil çünkü kullandığım sözlüklerin çoğu yararlı DataFrame nesneleri olacak kadar basit değil.
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))

Neden çalıştığına dair bir açıklama ekleyerek bu hatayı düzeltebilirsiniz.
Greg the Incredulous
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.