腌菜

2024-10-06 07:15:54 发布

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

当我试图修改我的列表,然后加载它时,我得到的错误是:

Traceback (most recent call last):
  File "C:\Users\T\Desktop\pickle_process\pickle_process.py", line 16, in <module>
    print (library[1])
IndexError: string index out of range

请提出解决方案 我的代码:

import pickle

library = []

with open ("LibFile.pickle", "ab") as lib:
    user = input("give the number")
    print ("Pickling")
    library.append(user)
    pickle.dump(user, lib)
    lib.close()

lib = open("LibFile.pickle", "rb")
library = pickle.load(lib)
for key in library:
    print (library[0])
    print (library[1])

Tags: inmost列表lib错误libraryopencall
2条回答

这与酸洗无关。我将编写新的示例代码来说明为什么它不起作用。你知道吗

library = []
library.append("user_input_goes_here")
print(library[0])
# OUTPUT: "user_input_goes_here")
print(library[1])
# IndexError occurs here.

你只是在空名单上加了一件事。为什么你认为有两个因素?:)

如果您多次执行此操作,则会失败,因为您正在以'ab'模式而不是'wb'模式打开pickle文件。每次写入时都应该覆盖pickle。你知道吗

import pickle

library = ["index zero"]
def append_and_pickle(what_to_append,what_to_pickle):
    what_to_pickle.append(what_to_append)
    with open("testname.pkl", "wb") as picklejar:
        pickle.dump(what_to_pickle, picklejar)
        # no need to close with a context manager

append_and_pickle("index one", library)
with open("testname.pkl","rb") as picklejar:
    library = pickle.load(picklejar)

print(library[1])
# OUTPUT: "index one"

这似乎有悖常理,因为您要“附加”到列表中,但请记住,一旦pickle对象,它就不再是列表,而是pickle文件。当您向列表中添加元素时,您实际上并没有附加到文件,而是更改了对象本身!这意味着您需要完全更改文件中写入的内容,以便它用附加的额外元素来描述这个新对象。你知道吗

您正在迭代load函数返回的对象,出于某种原因,您试图通过索引访问该对象。更改:

for key in library:
    print (library[0])
    print (library[1])

收件人:

for key in library:
    print key

Library[1]不存在,因此出现string index out of range错误。你知道吗

相关问题 更多 >