Learn to Code via Tutorials on Repl.it!

← Back to all posts
Python 3: Saving data in an uneditable, unreadable file!
Muffinlavania

Introducing Pickle! This module allows you to store data in a .dat file. It saves it in binary so people cant snoop around in your files, but you can load up the file anytime you want, and it will read that binary and convert it back to english! This also means that of course its not 'unreadable', computers can translate it back. Pickle can be useful for games where you want to save your data, but also want an efficient password system! All you have to do is import pickle, then you can save, load , and add data to binary files!

Saving data:

The pickle.dump part can be repeated as many times as you want, each one for a different variable you want to put in your newly created file!

Loading data:

The pickle.load part can again be repeated multiple times for many different variables

Adding Data!

Of course you can do this with many variables, and 'ab' means add binary. You need to already have 'your_variable.dat' saved or the code will error

This is a little bit hard to understand, and a bit hard to remember, but it is probably the most useful module i know!

There are more notes on this in the code itself, and thanks to @squidcoder for first showing me this, check out his projects for many examples of pickle.

And thanks to @medcho for the idea of making a tutorial on this!

Edit:
If you look at the files, like HI.dat, for some stupid reason repl saves everything BUT the sensitive information in binary. I guess you can still encrypt stuff, but its weird. One good thing tho, is that i can not see any of you guy's files.(I think you guys made some right?) So like @CodeLongAndPros said, we are all on different servers, so no one can look at another person's file, which still makes pickle viable for passwords and other things

Voters
jajamama
SleepyBehemoth
vahinsahu
AnshAgarwal1
TsunamiOrSumth
dabs364
R16
wjustin
coder787878
mkw
Comments
hotnewtop
jajamama

Awesome! THANKS!

Muffinlavania

@jajamama yessir

wjustin

@Muffinlavania how do you overwrite the file???

Muffinlavania

@wjustin what do yo mean overwrite it? If you load the variable from the file using the load function, then save that same variable back to it, it is replacing it, aka overwriting it. If you load a variable and APPEND something else to it, it will just add it. Also thanks for all the compliments, idk why so many people like this

wjustin

@Muffinlavania oh thx for noting

Muffinlavania

@wjustin what do you mean

wjustin

@Muffinlavania um i mean thx for telling me that i forgot

Muffinlavania

@wjustin oh ok yaaaaaaaa

dillonjoshua68

Oh ya... I just learned that it’s not good to unpickle files from untrusted sources.... and this is the least secure way to do deserialization, they said JSON is more secure.... so don’t unpickle anything from untrusted sources.... or the malicious code will enter ur terminal and the cracker will get control . But nice tutorial :) @Muffinlavania

dillonjoshua68

Also you can do this for pickle.dumps....

@Muffinlavania

Muffinlavania

@dillonjoshua68 what do you mean unpickle? like load up a file? well yea idk sure, but i guess ill have to trust repl :D

dillonjoshua68

The terms pickle and unpickle are used to make it easier to understand, and unpickling is like deserializing @Muffinlavania

Muffinlavania

@dillonjoshua68 oh ok, well umm im not going to change it (Because its easier to understand) and it still works, but thanks for telling me about it!

Muffinlavania

@dillonjoshua68 oh and also by the way, I've seen that you use .isdigit() in some of your projects, like the one were it store 30 students information. You can enter Rob1 and it wont error, because .isdigit() only works on a single character. So i would do something like this

dillonjoshua68
dillonjoshua68

Btw, for the markdown use this....
( `) 3 times for long code and write the code in between it or just check the markdown post @Muffinlavania

Muffinlavania

@dillonjoshua68 yea ik....
lol i might have used the ' instead of ` once or twice, whatever

dillonjoshua68

Btw, for the .isdigit() it checks the whole string or thing you put @Muffinlavania same for .isalpha()

Muffinlavania

@dillonjoshua68 oh really? ok...

dillonjoshua68
dillonjoshua68

Oh ya... btw... plz just check to confirm... when you don’t globalize name, and password, and rand if it’ll [email protected] cuz it worked for me...

Muffinlavania

@dillonjoshua68 oh really? cause if you put the save and loading functions in well, a function, you have to globalize it, to edit it... i think

dillonjoshua68

Nvm ur right @Muffinlavania

dillonjoshua68

The thing is that it won’t cause an error, but it’ll allow you to log in even if the password or username isn’t valid @Muffinlavania

dillonjoshua68

Also.... we can use lists [ ] instead of the strings " " [email protected]
Cuz u use strings for ur repl.... but I wondered if lists would be fine?

dillonjoshua68

Oh btw... I forked ur repl (ok :) )... and I edited it a bit just to familiarize myself with how it works, and also for good practice with pickle. @Muffinlavania ...BTW, make sure to try marshal module or json for better security

dillonjoshua68

Also... Data types which can be pickled:
Bool, Int, Float, Complex numbers, (Normal and Unicode) str, Tuples, Lists, Sets, Dicts that obtain, picklable objects

Example script:
import pickle

dogs_dict = {‘ozzy’: 3, ‘roger’: 8, ‘luna’: 5}

to pickle this, you need to specify the name of the file you’ll write it to (file doesn’t have an extension)....

arguments: 1. Name of file, 2. wb (we are writing..w.. in binary mode..b..) or even w+b.

like this:

filename = ‘dogs’
outfile = open(filename, ‘wb’)

use pickle.dump() which takes 2 arguments: 1. The object to pickle, 2. File to save it in.

like this:

pickle.dump(dogs_dict, outfile)
outfile.close() # closing the file

Unpickling files:
using the same open() function.... we pass the second argument as ‘rb’ which is read mode + binary mode. Next use pickle.load() following the same argument format as pickle.dump(). But use new variables

Example:
infile = open(filename, ‘rb’)
new_dict = pickle.load(infile)
infile.close()

to make sure you unpickle it successfully do this:

print(new_dict)
print(new_dict == dogs_dict)
print(type(new_dict))

Compressing pickle files:
If you’re saving a large dataset and your pickled file takes up a lot of space... you may want to compress it. This can be done using bzip2 or gzip. They both compress files. bzip2 is slower, and gzip produces files about 2* larger that bzip2.

Example:
import bz2

bzip2

import pickle

smaller_file = bz2.BZ2File(‘sfile’, ‘w’)
pickle.dump(dogs_dict, smaller_file)

To unpickle objects that were written in python 2.... to python 3 do this:

Example:
infile = open(file_name, ‘rb’)
new_dict = pickle.load(infile, encoding = ‘latin1’)

pass an encoding argument and set equal to latin1.

if it contains numpy arrays use encoding = ‘bytes’

@Muffinlavania

DollarSign

omfg it works

VulcanWM

Thanks for the mention!

jajamama

Awesome!Thanks!

JordanDixon1


you can still see the info.

Muffinlavania

@JordanDixon1 yea i think repl just does this for no reason, it works on some other coding websites, i really dont know

Leroy01010

error in greeter

Muffinlavania

@Leroy01010 im there

wjustin

owww mmyy gaddddd it works excellent job @Muffinlavania!!!!

wjustin

who else is looking at this repl this is legend!!!

Muffinlavania
DollarSign

I needed this a year ago now

Muffinlavania

@DollarSign lol thanks you like it?

DollarSign

yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy (my hands hurt now) @Muffinlavania

Muffinlavania

@DollarSign woah... is that yes spammed or is that why spammed

DollarSign

i typed y and kept tapping y, my hadns stil rut
@Muffinlavania

ChezCoder

pretty sick but kinda confusing

Muffinlavania

@ChezCoder yea.... do you think i just explained it weird or it is confusing in general

AmazingMech2418

This actually seems pretty easy to read. In the default file,

it is clear that the name is "HI", the password is "hiya", and the random thing is "i like cheese".

Muffinlavania

@AmazingMech2418 yea idk it used to save everything in the symbols... idk

wjustin

@AmazingMech2418 buahhhahahahahahahahahhahahahaa

wjustin
dillonjoshua68

Use json or marshal @AmazingMech2418

CodeLongAndPros

I don’t think this is “unreadable”, any dev with a hex editor and/or python can read it. I would change it to ununderstanable.

Muffinlavania

@CodeLongAndPros lol ok i will i guess... that just sounds weird which is why i said unreadable, you cant read it. Of course computers can be ill change it whatever

CodeLongAndPros

@Muffinlavania Or you could say that it is noneditable.

Muffinlavania

@CodeLongAndPros yea thanks and btw does the project work?

CodeLongAndPros

@Muffinlavania The repl? 1==1.

Muffinlavania

@CodeLongAndPros yea i mean the project right here, because i dont see any new files

CodeLongAndPros

@Muffinlavania Probably because you can’t see other files because you’re on a diff server

Muffinlavania

@CodeLongAndPros yea.. well at least it works!