python 3.2版酸洗。装载随机结果

2024-06-01 20:37:42 发布

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

我遇到了一个非常奇怪的错误。我有一个每天运行的cronjob:它打开一个pickle文件,加载该文件,然后处理数据。在脚本的最后,它将数据保存到该文件中,以备第二天处理。在

大多数情况下,这个脚本运行得很好,但是有一段时间(我想是一个月两次)打开该文件时,会引发一个eoferor:

Traceback (most recent call last):
  File "read.py", line 11, in <module>
    SellerDictionarycf=pickle.load(SellerDict)
EOFError

我坚信没有其他进程在处理这个文件,我百分之百确定我写了数据,在读之前关闭了这个文件。在

我的代码很难在脚本开头读取文件:

^{pr2}$

我的代码建议在脚本末尾写入文件:

SellerDict=open('/home/hostadl/SellerDictab','wb')
pickle.dump(SellerDictionaryab,SellerDict)
SellerDict.flush()
SellerDict.close()

我保存了一个损坏文件的副本(读取时会引发EOFError的文件),然后用pickletools检查,错误如下:

python3.2 -m pickletools -o test.txt SellerDictab
Traceback (most recent call last):
  File "/usr/local/lib/python3.2/runpy.py", line 160, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/local/lib/python3.2/runpy.py", line 73, in _run_code
    exec(code, run_globals)
  File "/usr/local/lib/python3.2/pickletools.py", line 2403, in <module>
    args.indentlevel, annotate)
  File "/usr/local/lib/python3.2/pickletools.py", line 1963, in dis
    for opcode, arg, pos in genops(pickle):
  File "/usr/local/lib/python3.2/pickletools.py", line 1874, in genops
    arg = opcode.arg.reader(pickle)
  File "/usr/local/lib/python3.2/pickletools.py", line 474, in read_unicodestring4
    "remain" % (n, len(data)))
ValueError: expected 2254 bytes in a unicodestring4, but only 0 remain

在测试.txt仍然有数据,这是头和尾:

head test.txt
    0: \x80 PROTO      3
    2: }    EMPTY_DICT
    3: q    BINPUT     0
    5: (    MARK
    6: X        BINUNICODE 'bradey4357604769'
   27: q        BINPUT     1
   29: ]        EMPTY_LIST
   30: q        BINPUT     2
   32: ]        EMPTY_LIST
   33: q        BINPUT     3

tail test.txt
18933166: e                appendS    (MARK at 18930621)
18933167: ]            EMPTY_LIST
18933168: r            LONG_BINPUT 174342
18933173: (            MARK
18933174: X                BINUNICODE 'HP PhotoSmart C4480 All-in-One Printer'
18933217: r                LONG_BINPUT 174343
18933222: G                BINFLOAT   45.0
18933231: G                BINFLOAT   84104.0
18933240: X                BINUNICODE 'Salt Lake City,  UT '
18933265: r                LONG_BINPUT 174344

对于好的文件(没有EOFError),这里是头和尾:

head testgood.txt
    0: \x80 PROTO      3
    2: }    EMPTY_DICT
    3: q    BINPUT     0
    5: (    MARK
    6: X        BINUNICODE 'bj8016541577'
   23: q        BINPUT     1
   25: ]        EMPTY_LIST
   26: q        BINPUT     2
   28: (        MARK
   29: ]            EMPTY_LIST

tail testgood.txt
16569368: X                BINUNICODE 'Bought this beautiful dinner set but never opened it, I would love to get rod of it pleas tex with an offer...'
16569483: r                LONG_BINPUT 161843
16569488: J                BININT     20177894
16569493: X                BINUNICODE 'antonio8016497082'
16569515: r                LONG_BINPUT 161844
16569520: e                APPENDS    (MARK at 16569283)
16569521: e            APPENDS    (MARK at 16568508)
16569522: u        SETITEMS   (MARK at 16088830)
16569523: .    STOP

那么这个问题的原因是什么(比如字符串数据中的奇怪字符)?我对这个问题一无所知。在


Tags: 文件inpytxtlibusrlocalline
1条回答
网友
1楼 · 发布于 2024-06-01 20:37:42

似乎磁盘空间不足(或由于类似原因无法写入完整文件)。在

一个更惯用的版本(不需要担心调用close/flush)是:

with open('/home/hostadl/SellerDictab','rb') as SellerDict:
    SellerDictionaryab=pickle.load(SellerDict)

with open('/home/hostadl/SellerDictab','wb') as SellerDict:
    pickle.dump(SellerDictionaryab,SellerDict)

相关问题 更多 >