2015-01-25 14 views
7

Sto usando Pycharm. Prima di tutto quando ogni modulo viene importato in Pycharm. La linea di importazione completa svanisce. Ma in caso di import shelve non svanisce. Anche quando ho eseguito il file io ottenere i seguenti errori:shelve: tipo db non può essere determinato

Traceback (most recent call last): 
    File "/Users/abhimanyuaryan/PycharmProjects/shelve/main.py", line 13, in <module> 
    s = shelve.open("file.dat") 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/shelve.py", line 239, in open 
    return DbfilenameShelf(filename, flag, protocol, writeback) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/shelve.py", line 223, in __init__ 
    Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/dbm/__init__.py", line 88, in open 
    raise error[0]("db type could not be determined") 
dbm.error: db type could not be determined 

Ecco il mio codice:

import shelve 

s = shelve.open("file.dat") 

s["first"] = (1182, 234, 632, 4560) 
s["second"] = {"404": "file is not present", "googling": "Google to search your content"} 
s[3] = ["abhilasha", "jyoti", "nirmal"] 

s.sync() 

print(s["first"]) 
print(s["second"]) 
print(s[3]) 
+0

Quindi, che tipo DB è 'file.dat' dovrebbe essere? Esiste? Apparentemente questo è ciò che sta causando i problemi di PyCharm qui, anche se non è del tutto chiaro il perché. –

+0

Ho scritto in un file dat usando pickle e ha scritto in quel file. Non riesco ancora a capire quale sia il problema in questo caso n Sì, il file termina. – AbhimanyuAryan

risposta

5

L'OP spiega in un commento che è stato creato da 'file.dat'pickle - e questo è il problema! picklenon utilizza nessun formato di DB - utilizza il proprio! Crea file.dat con shelve in primo luogo (ad esempio, esegui shelve quando file.dat non esiste ancora e salva la roba in esso) e starai bene.

OP nel commento: "Non riesco ancora a capire quale sia il problema in questo caso". Risposta: il problema è che pickle non è non creare un file in uno qualsiasi dei formati DB shelve può essere utilizzato. Utilizza un singolo modulo per serializzare e deserializzare - o solo pickle, o, solo shelve - e funzionerà molto meglio :-).

+0

capito grazie :) – AbhimanyuAryan

1

C'è un bug con anydb https://bugs.python.org/issue13007 che non può utilizzare l'identificazione corretta per i file gdbm.

Quindi, se si sta tentando di aprire un file gdbm valida con ripiano e viene thorwing che l'uso di errore questo, invece:

mod = __import__("gdbm") 
    file = shelve.Shelf(mod.open(filename, flag)) 
Problemi correlati