Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何保存会话数据(Python)_Python - Fatal编程技术网

如何保存会话数据(Python)

如何保存会话数据(Python),python,Python,假设有一些代码是我写的,其他人使用,输入他们的名字,做代码中的其他事情 name = input('What is your name? ') money = 5 #There is more stuff, but this is just an example. 我如何才能将这些信息保存到一个文本文件中,以便在以后的会话中继续调用。类似于视频游戏中的保存点。您可以将信息写入文本文件。例如: mytext.txt myfile.py 然后,要再次访问它: with open('mytext.t

假设有一些代码是我写的,其他人使用,输入他们的名字,做代码中的其他事情

name = input('What is your name? ')
money = 5
#There is more stuff, but this is just an example.

我如何才能将这些信息保存到一个文本文件中,以便在以后的会话中继续调用。类似于视频游戏中的保存点。

您可以将信息写入文本文件。例如:

mytext.txt myfile.py 然后,要再次访问它:

with open('mytext.txt') as mytextfile:
    the_original_name = mytextfile.read()

print the_original_name
# Whatever name was inputted will be printed.

根据@Justin的评论,下面是我每次保存和阅读会话的方式:

import cPickle as pickle

def WriteProgress(filepath, progress):
    with open(filepath, 'w') as logger:
        pickle.dump(progress, logger)
        logger.close()

def GetProgress(filepath):
    with open(filepath, 'r') as logger:
        progress = pickle.load(logger)
        logger.close()
    return progress

WriteProgress('SaveSessionFile', {'name':'Nigel', 'age': 20, 'school': 'school name'})
print GetProgress('SaveSessionFile')
{'age':20,'name':'Nigel','school':'school'}

这样,当您再次读取该文件时,您可以拥有之前声明的所有变量,并从您停止的地方开始


请记住,由于您的程序使用pickle模块读取和写入会话信息,因此在写入文件后对其进行篡改可能会导致无法预料的结果;因此,请注意,只有程序写入和读取该文件

您可能正在搜索一种通用机制,使保存和恢复所需信息更加容易。这在编程中被称为持久性。然而,它不是自动的。有一些技术可以实现它。实现的系统越复杂和具体,机制就越具体

对于简单的情况,将数据显式存储到文件中就可以了。正如Smac89中所示,
pickle
模块是保存整个Python对象状态的标准方法。然而,这并不是你一直需要的

更新:以下代码显示了原理。应针对实际使用情况对其进行增强(即,不应以这种方式使用,仅在教程中使用)



我怎样才能保存所有其他的东西呢?我希望能够从我在会话中中断的地方继续。@Justin您可能还想看看,它可以帮助将列表和元组等结构添加到文件中,以便于输入/output@Smac89我仍然不明白如何将整个会话保存到文本文件中。你给我的链接只告诉我如何保存一行。另外,如何读取文件的链接有点混乱,因为我不知道这些函数/命令是什么。你能解释一下吗?谢谢。@Justin:问题是你想“保存整个会话”是什么意思。什么是“其他所有东西”?@pepr我写了一些代码,用户使用“运行模块”执行。然后代码要求输入,如姓名、年龄等。我想保存这些信息,如果用户退出,他/她可以从他/她离开的地方访问。就像视频游戏中的保存点。您可以先使用检查文件是否为空,然后决定从文件中读取其中的所有信息,直到保留非空信息为止。你最后读到的任何信息都是最后输入的信息,你可以从那里开始游戏。记得在用户退出之前将所有内容保存回文件!你这是什么意思session@Owen我认为他正在尝试创建某种类型的游戏,因此他需要保存用户的进度,以便用户可以从他们想要的地方开始left@Owen我所说的会话是指当用户执行代码、更改变量等时@Justin存储代码状态不是一个好的解决方案,相反,你应该定义你需要存储哪些变量,并选择以何种方式存储它们,这样我就必须单独输入我所有的变量?另外,我想解释一下这些定义函数的作用,等等。我想知道我在写什么,这样我就可以解释和理解它。另外,当我想把变量放在列表中时,我不能,它要求字符串,我猜是“”,而不是字节。如何保存变量,在您的解释中,“名称”预定义为“Nigel”,但我的变量是用户输入的,因此我无法知道它们是什么,也无法预定义它们。我尝试使用该答案中指出的方法,但是,我只能保存字符串,而不能保存变量(字节)。如何保存它们?您使用的Python版本是什么?我使用的是3.3.1版本。OK。你所说的保存变量到底是什么意思?在Python(以及其他语言)中,文件可以打开,也可以以文本模式或二进制模式打开。Python-3字符串只有在以文本模式以规定的编码打开文件时才能直接保存(默认编码取决于操作系统)。或者您必须显式地对字符串进行编码,并将其写入以二进制模式打开的文件)。无论如何,一个字节流总是被写入文件——与文件的打开方式无关。我想保存一个整数。我用错名字了。我似乎无法保存整数,它一直坚持它必须是字符串。我不知道文本模式或二进制模式,但我对它的理解是空闲的,只需单击打开窗口命令执行器的.py文件即可。
with open('mytext.txt') as mytextfile:
    the_original_name = mytextfile.read()

print the_original_name
# Whatever name was inputted will be printed.
import cPickle as pickle

def WriteProgress(filepath, progress):
    with open(filepath, 'w') as logger:
        pickle.dump(progress, logger)
        logger.close()

def GetProgress(filepath):
    with open(filepath, 'r') as logger:
        progress = pickle.load(logger)
        logger.close()
    return progress

WriteProgress('SaveSessionFile', {'name':'Nigel', 'age': 20, 'school': 'school name'})
print GetProgress('SaveSessionFile')
#!python3

fname = 'myfile.txt'

def saveInfo(fname, name, money):
    with open(fname, 'w', encoding='utf-8') as f:
        f.write('{}\n'.format(name))
        f.write('{}\n'.format(money))  # automatically converted to string

def loadInfo(fname):
    # WARNING: The code expect a fixed structure of the file.
    #   
    # This is just for tutorial. It should never be done this way
    # in production code.'''
    with open(fname, 'r', encoding='utf-8') as f:
        name = f.readline().rstrip()   # rstrip() is an easy way to remove \n
        money = int(f.readline())      # must be explicitly converted to int
    return name, money              


name = input('What is your name? ')
money = 5
print(name, money)

# Save it for future.
saveInfo(fname, name, money)

# Let's change it explicitly to see another content.
name = 'Nemo'
money = 100
print(name, money)

# Restore the original values.
name, money = loadInfo(fname)
print(name, money)