Pickle (Python 3.6) 写入空文件
Posted
技术标签:
【中文标题】Pickle (Python 3.6) 写入空文件【英文标题】:Pickle (Python 3.6) Writes Empty File 【发布时间】:2018-05-18 12:37:04 【问题描述】:我正在尝试自学 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 之外,使用其他东西来保存我的数据可能更有意义(有什么建议吗?)。即使是这样,我仍然想知道我在这里做错了什么,所以我以后不会犯同样的错误。
【问题讨论】:
不要将open(file_name, 'rb')
传递给pickle.load
。使用上下文管理器确保退出时文件已关闭。
如果你的数据是纯 python dict/lists...你最好用json
说。
【参考方案1】:
问题不在于 pickle 模块,而在于以下代码行:
all_posts = previous_posts.extend(current_posts)
实际发生的是调用 extend 方法,扩展 previous_posts,一旦成功完成,返回关键字 None。
然后您将这个关键字分配给 all_posts 而不是 previous_posts 的内容,然后将其写入文件。
尝试如下修改:
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()
最好是加入 Jean-Francois 的建议:
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)
【讨论】:
有趣。关于这些问题何时发生,是否有一个普遍的理念?我从没想过扩展运算符会返回“无”。没有添加一条 all_posts = previous_posts 的行,有没有办法通过简单地将两者结合起来创建一个新列表? 'with' 风格是什么意思? @user71216 在这种情况下你可以做all_posts = previous_posts + current_posts
@user71216 请注意,上述方法仅在两者都是列表时才有效。如果current_posts
是一个集合,则需要使用extend()
方法,该方法适用于任何可迭代对象
已对其进行了修改,接受了建议的编辑并删除了关于 with 样式的评论,因为它现在被合并了。 @user71216 现在,它会在每个标识的部分完成后自动关闭打开的文件(这是前面提到的 with 样式,现在已被删除)。以上是关于Pickle (Python 3.6) 写入空文件的主要内容,如果未能解决你的问题,请参考以下文章