У меня есть словарь, и я пытаюсь записать его в файл.
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