Pickle(Python3.6)写入空文件

Pickle(Python3.6)写入空文件,python,python-3.x,save,pickle,Python,Python 3.x,Save,Pickle,我试图自学Python,因此创建了一个哑脚本来检查博客网站,检查新的更新,然后保存与更新相关的元数据。如果有新帖子,我打开以前的元数据,附加新的元数据,然后保存。然而,我发现这些更新经常会产生一个空文件(不知道它什么时候起作用,什么时候不起作用),我会丢失所有的元数据 if new_post_count > 0: file_name = 'all_posts' + user previous_posts = pickle.load(open(file_na

我试图自学Python,因此创建了一个哑脚本来检查博客网站,检查新的更新,然后保存与更新相关的元数据。如果有新帖子,我打开以前的元数据,附加新的元数据,然后保存。然而,我发现这些更新经常会产生一个空文件(不知道它什么时候起作用,什么时候不起作用),我会丢失所有的元数据

if new_post_count > 0:
        file_name = 'all_posts' + user

        previous_posts = pickle.load(open(file_name, 'rb'))

        current_posts = get_posts(client, user, start_from_posts=0, total_posts=new_post_count)

        all_posts = previous_posts.extend(current_posts)

        f = open(file_name, 'wb')
        pickle.dump(all_posts, f)
        f.close() 

看看论坛,除了pickle(有什么建议吗?)之外,使用其他东西来保存我的数据可能更有意义。即使是这样,我还是想知道我在这里做错了什么,这样以后就不会再犯同样的错误。

问题不在于pickle模块,而在于其中的一行内容:

 all_posts = previous_posts.extend(current_posts)
实际发生的情况是调用了extend方法,在适当的位置扩展以前的文章,一旦成功完成,就会返回关键字None

然后将此关键字分配给所有的_帖子,而不是以前的_帖子的内容,然后将其写入文件

尝试按如下方式修改它:

if new_post_count > 0:
    file_name = 'all_posts' + user

    previous_posts = pickle.load(open(file_name, 'rb'))

    current_posts = get_posts(client, user, start_from_posts=0, total_posts=new_post_count)

    previous_posts.extend(current_posts)

    f = open(file_name, 'wb')
    pickle.dump(previous_posts, f)
    f.close() 
最好包括让·弗朗索瓦的建议:

if new_post_count > 0:
    file_name = 'all_posts' + user
    with open(file_name, 'rb') as f:
        previous_posts = pickle.load(f)

    current_posts = get_posts(client, user, start_from_posts=0, total_posts=new_post_count)

    previous_posts.extend(current_posts)

    with open(file_name, 'wb') as f:
        pickle.dump(previous_posts, f) 

不要将
open(文件名,'rb')
传递到
pickle.load
。使用上下文管理器确保退出时文件已关闭。如果数据是纯python dict/lists。。。您最好使用
json
,这很有趣。关于这些问题何时发生,是否有一个普遍的理念?我决不会期望extend操作符返回“None”。除了添加一行表示all_posts=PREVICE_posts之外,还有没有一种方法可以通过简单地将两者结合起来来创建一个新列表?“with”style是什么意思?@user71216在本例中,您可以执行
all_posts=previous_posts+current_posts
@user71216请注意,上述方法仅在两者都是列表时有效。如果
current\u posts
是一个集合,那么您需要使用
extend()
方法,该方法适用于任何ITerable。如果您已经修改了它,则接受建议的编辑并删除关于with样式的注释,因为它现在已合并@user71216现在,它会在每个标识的部分完成后自动关闭打开的文件(这是前面提到的样式,现在已编辑掉)。