在一个循环中反复写入文件的方法(Python3.6)

2024-09-30 22:21:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在运行一个从其他客户机接收数据的程序,在编写和更改文件中的信息时遇到了大量的问题,我觉得我什么都试过了。我想保存信息,以防程序因某种原因停止,这样数据就可以保存了。我觉得我什么都试过了,用file.flush,用os.fsync(),我试过用with open(file) as file:语句在程序停止时关闭文件,现在,我试着退出,让函数在文件关闭时写入文件,但还没有成功,加上没有调用错误,所以有点不相关。我正在寻找一种方法来写入文件,重复,以及,嗯,工作。我可能不明白什么,所以请给我解释一下。我一直有麻烦,需要帮助。你知道吗

EDIT

AccData = {}

client = discord.Client()
User = discord.User
def SaveData():
    pickle.dump(AccData,data)
    data.close()
    print("data saved")
atexit.register(SaveData)

f = open('DisCoin.json','rb')
AccData = pickle.load(open('DisCoin.json','rb'))
f.seek(0)
f.close()

data = open('DisCoin.json','wb')

Tags: 文件程序jsonclosedata客户机openpickle
2条回答

Python捕获自己的异常、大多数信号和exit(),然后运行atexit例程进行清理。所以,你可以在那里处理正常的坏习惯。你知道吗

但也有其他不好的事情发生。分段错误或其它内部错误。未知信号。调用os._exit()的代码。这将导致提前终止,并且尚未刷新的数据将丢失。任何程序都可能发生不好的事情,如果它们需要额外的恢复能力,它们需要一些方法来处理。你知道吗

  • 您可以将内容写入临时文件,并仅在完成后将其重命名为“活动”文件。如果程序终止,至少它最后保存的数据仍然存在。

  • 您可以编写更改日志或日志,并通过扫描该日志来重建所需的数据。这就是许多文件系统的工作原理,“大数据”将系统映射/简化为基本相同的东西。

  • 您可以移动到数据库并使用它的事务处理或任何OLPT系统来确保您对数据存储进行全部或全部更新。

您的示例代码特别脆弱,因为

data = open('DisCoin.json','wb')

清除磁盘上的现有数据。用这个密码是不可能回去的!那么,第一步就是不要那样做。保留旧数据,直到新数据准备好。你知道吗

下面是一个为您管理临时文件的示例类。使用它而不是open,它将创建一个临时文件供您更新,并且只使用with子句的数据运行,没有异常。如果在with子句中使用atexit处理程序,则不需要它。你知道吗

import shutil
import os

class SidelineFile:
    def __init__(self, *args, **kw):
        self.args = list(args)
        self.kw = kw

    def __enter__(self):
        self.closed = False
        self.orig_filename = self.args[0]
        self.args[0] += '.tmp'
        try:
            mode = self.args[1]
        except IndexError:
            try:
                mode = self.kw['mode']
            except KeyError:
                mode = 'r'
        if 'a' in mode:
            shutil.copy2(self.orig_filename, self.args[0])
        self.file_obj = open(*self.args, **self.kw)
        return self.file_obj

    def __exit__(self, exc_type, exc_value, traceback):
        if not self.closed:
            self.file_obj.close()
            self.closed = True
        if not exc_type:
            os.rename(self.args[0], self.orig_filename)
        else:
            os.remove(self.args[0])


fn = 'test.txt'

with SidelineFile(fn, 'w') as fp:
    fp.write("foo")
print(1, repr(open(fn).read()))

with SidelineFile(fn, mode='a') as fp:
    fp.write("bar")
print(2, repr(open(fn).read()))

with SidelineFile(fn, 'w') as fp:
    fp.write("foo")
print(3, repr(open(fn).read()))

try:
    with SidelineFile(fn, 'a') as fp:
        fp.write("bar")
        raise IndexError()
except IndexError:
    pass
print(4, repr(open(fn).read()))

我个人喜欢通过为它定义一个打印函数来实现这一点。你知道吗

import os

def fprint(text,**kwargs):
    os.chdir('C:\\mypath')
    myfile=open('output.txt','a')
    if kwargs:
        print(text,end=kwargs['end'],file=myfile)
    else:
        print(text,file=myfile)
    myfile.close()

fprint('Hello')
input()
fprint('This is here too',end='!!\n')

上面的代码将“Hello”写入文件'输出.txt'在C:\mypath,保存它,然后在输入一些信息后,会写'这里也是!!'进入文件。如果在脚本等待输入时检查该文件,它应该已经包含“Hello”。你知道吗

相关问题 更多 >