Писать словарь в текстовый файл?

У меня есть словарь, и я пытаюсь записать его в файл.

  exDict = {1: 1, 2: 2, 3: 3} с открытым  ('file.txt', 'r') как file: file.write (exDict)  

Тогда у меня ошибка

  file.write (exDict) TypeError: должно быть str, а не dict  

Итак, я исправил эту ошибку, но появилась другая ошибка

  exDict = {111: 111, 222: 222} с open ('file.txt', 'r') как file: file.write (str (exDict))  

Ошибка:

  file.write (str (exDict)) io.UnsupportedOperation: не доступен для записи  

Понятия не имею что делать, поскольку я все еще новичок в python. Если кто-то знает, как решить эту проблему, дайте ответ.

ПРИМЕЧАНИЕ. Я использую python 3, а не python 2


Прежде всего вы открываете файл в режиме чтения и пытаетесь записать в него. Консультация — режимы ввода-вывода python

Во-вторых, вы можете записать только строку в файл. Если вы хотите написать объект словаря, вам нужно либо преобразовать его в строку, либо сериализовать.

  import json #, как указано в commentexDict = {'exDict': exDict}  with open ('file.txt', 'w') as file: file.write (json.dumps (exDict)) # используйте `json.loads`, чтобы сделать обратное  

В случае сериализации

  импортировать cPickle как picklewith open ('file.txt', 'w') as file: file.write (pickle.dumps (exDict)) #  используйте `pickle.loads`, чтобы сделать обратное  

Для python 3.x импорт пакета pickle будет другим

  import _pickle  как рассол  

Я делаю это так в python 3:

  с open ('myfile.txt', 'w') как f: print (mydictionary, file = f)  

7


  fout = "/your/outfile/here.txt"fo = open (fout," w "  ) для k, v в yourDictionary.items (): fo  .write (str (k) + '>>>' + str (v) + ' n  n') fo.close ()  

2


Проблема с вашим первым блоком кода заключалась в том, что вы открывали файл как ‘r’ даже если вы хотели написать в него, используя 'w'

  с open ('/Users/your/path/foo', '  w ') как data: data.write (str (словарь))  

2


Если вам нужен словарь, который вы можете импортировать из файла по имени, а также добавляющие записи, которые хорошо отсортированы и содержат строки, которые вы хотите сохранить, вы можете попробуйте это:

  data = {'A': 'a', 'B': 'b',} с open ('file.py', 'w')  как файл: файл. write ("dictionary_name = { n") для k в отсортированном (data.keys ()): file.write ("'% s': '% s',  n"% (k, data [k]))  file.write ("}")  

Затем для импорта:

  из файла import dictionary_name  

1


Для любителей понимания списка это напишет все пары ключ: значение в новых строках в dog.txt

  my_dict = {'foo': [1,2]  , 'bar': [3,4]} # создать список stringslist_of_strings = [f '{key}: {my_dict [key]}' для ключа в my_dict] # записать строку одну за другой, добавив newlinewith open ('dog.txt  ',' w ') как my_file: [my_file.write (f' {st}  n ') для st в list_of_strings]  


Я знаю, что это старый вопрос, но я также подумал поделиться решением, которое не связано с json. Мне лично не нравится json, потому что он не позволяет легко добавлять данные. Если ваша отправная точка — словарь, вы можете сначала преобразовать его в фрейм данных, а затем добавить его в свой текстовый файл:

  импортировать панды как pdone_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')  

Надеюсь, это поможет.

2


  exDict = {1: 1, 2: 2, 3: 3} с open ('file.txt',  'w +') как файл: file.write (str (exDict))  


Вы можете сделать следующее:

  import jsonexDict = {1: 1, 2: 2, 3: 3} file.write (json.dumps  (exDict))  

https://developer.rhino3d.com/guides/rhinopython/python-xml-json/


  импортировать jsonwith open ('tokenler.  json ',' w ') как файл: file.write (json.dumps (mydict, sure_ascii = False))  

1



Сохранение/загрузка словаря в/из файла .txt (2.58 + Python)

Я работаю над игрой, которая позволяет игроку создавать лабиринт, создавая/уничтожая блоки в ограниченном пространстве. У меня есть словарь данных блока в этом формате:

  dict ['x, y'] = [x, y, 'name', object, position]  

У меня также все свойства сохранены в другом словаре.

Мне нужно знать, как записать эти (несколько) словарей в один текстовый файл или любой другой формат файла, который будет работать, а затем как заставить Python читать текстовый файл и иметь возможность для разделения и реструктуризации словарей.

Его необходимо сохранить во внешний файл для удобной отправки другим людям, которые хотят загрузить и воспроизвести лабиринт.
Любые идеи, если это возможно?

Edit: Думал, я должен упомянуть это, чтобы избежать путаницы: у меня уже есть система, настроенная для чтения данных словаря и заполнения лабиринта объектами. Дело в том, что словарная информация просто передается во внешний файл и из него.


Вы можете использовать возможность Pickle, чтобы раскалить и удалить ваши объекты кода, если хотите, хотя вы могли бы так же легко использовать базовые функции чтения/записи файлов, чтобы справиться с этим.

  f = open ('save.txt', 'w') for block in obj  ['dict']: f.write (block)  

Думаю, это должно сработать.


  import pickled = {"foo": "bar", "spam": "egg"} с open ('map.save', 'wb') как f: pickle.dump (d, f)  

В примере SolarLune вы захотите убедиться, что дескриптор файла закрыт (f.close ()). Хотя это и не обязательно в Python, это хорошая привычка. Кроме того, я не думаю, что какие-либо классы Python из BGE можно выбирать (KX_GameObject, Mathutils.Vector и т. Д.).

Для получения дополнительной информации о модуле pickle: http://docs.python. org/py3k/library/pickle.html


Правильно Могури — закрыть файл — хорошая идея. Травление полезно, потому что оно отлично сохраняет данные в файле (если я помню).


ммм … Могури … есть ли какой-нибудь простой способ сохранить векторные типы данных в GlobalDict или упомянутый выше метод?


@saga:

Вы всегда можете преобразовать векторные данные:

  import bgeobj = bge.logic.getCurrentController (). owner # Эта строка преобразует Mathutils.Vector в список floatsvec = [i for i in obj.worldPosition]  

У меня аналогичная проблема:
Я пытаюсь сохранить словарь со словарями внутри, pickle не работает, потому что внутри также есть классы GameEngine, такие как векторы и матрицы.
Любые Идеи решения проблемы?
Единственный способ, который я могу представить, — это записать несколько файлов. Есть предложения?


Данные, которые я сохраняю, не содержат классов Python Game Engine, они все преобразованы в целые числа, строки и списки. Объект с индексом 3 перед сохранением изменяется на «Нет», эта переменная создается при заполнении лабиринта и предназначена для ссылки на внутриигровой объект.

Я планировал создать список, содержащий 2 словаря, сохраненные свойства игры и данные блока.
Я просмотрел документацию по модулю Pickle, который для меня совершенно новый, и я не уверен, как его загрузить сохраненный словарь.

Это примерно то, что у меня есть до сих пор:

  # "блокирует" словарь # "свойства" словарьimport picklepath = '/saves/' file  = 'map.save'def save (): gameData = [блоки, свойства] с open (путь + файл,' wb ') как f: pickle.dump (gameData, f) def load (): # ??  

Я не совсем уверен, как написать код pickle.load () , чтобы заставить его извлекать сохраненные данные и применять их к gameData , поэтому любые примеры будут действительно полезны


  # "блокирует" словарь # "свойства" словарьimport picklepath =  '/saves/' file = 'map.save'def save (): gameData = [блоки, свойства] с open (путь + файл,' wb ') как f: pickle.dump (gameData, f) def load ()  : с open (path + file, 'rb') как f: gameData = pickle.load (f)  

Спасибо, Могури.
Другой проблема возникла, и я не уверен, что ее вызывает. Когда я пытаюсь открыть файл ‘map.save’ для записи в него, я получаю следующую ошибку:
IOError: [Errno 13] Permission denied ‘map.save’


Да ладно, я думал, он собирался записать файл по локальному пути, по которому был сохранен .blend, а не из верхнего каталога, что объясняет отказ в разрешении.

Есть ли способ заставить его писать туда, где сохранен .blend, не указывая слишком конкретный путь к каталогу, например «…/saves/», чтобы ему не приходилось обращаться к весь каталог «C:/Users/…»?


Что-то вроде:

  import osfilename = "save.txt"  file = os.path.join (bge.logic.expandPath ("//"), filename)  

bge.logic.expandPath () работает относительно смешанный файл. os.getcwd () — это текущий рабочий каталог Python (который может совпадать или отличаться от того, где находится смесь).

  import bgeimport ospath = bge.logic.expandPath (  "//сохраняет") # или os.path.join (os.getcwd (), "saves") file = "map.save" с open (os.path.join (путь, файл)) как f: print (  f.read ())  

Спасибо за помощь, я очень признателен. У меня сейчас работает грубая, но хорошая система сохранения/загрузки. Есть еще несколько вещей, которые нужно улучшить, но система работает, и я могу обмениваться картами лабиринта с друзьями.

Вот упрощенная версия системного кода. «G» — это импортированный модуль, который содержит важные глобальные данные игры, такие как данные блоков.

  def save (): import pickle path = l.expandPath ("//")  file = "map.maze" blocks = g.blocks для i в блоках: blocks [i] [3] = None properties = g.sceneProps gameData = [блоки, свойства] с открытым (путь + файл, 'wb') как  f: pickle.dump (gameData, f) def load (): import pickle path = l.expandPath ("//") file = "map.maze" с open (path + file, 'rb') как f: gameData  = pickle.load (f) g.blocks = gameData [0] loadProps (gameData [1]) def loadProps (props): g. sceneProps ['sizes'] = props ['sizes'] g.sceneProps ['points'] = props ['points']  

Не совсем никакого интерес для всех: L

Оцените статью
clickpad.ru
Добавить комментарий