Each Answer to this Q is separated by one/two green lines.
I’m trying to open a file, and if the file doesn’t exist, I need to create it and open it for writing. I have this so far:
#open file for reading fn = input("Enter file to open: ") fh = open(fn,'r') # if file does not exist, create it if (!fh) fh = open ( fh, "w")
The error message says there’s an issue on the line
if(!fh). Can I use
exist like in Perl?
If you don’t need atomicity you can use os module:
import os if not os.path.exists('/tmp/test'): os.mknod('/tmp/test')
import os if not os.path.exists('/tmp/test'): with open('/tmp/test', 'w'): pass
''' w write mode r read mode a append mode w+ create file if it doesn't exist and open it in (over)write mode [it overwrites the file if it already exists] r+ open an existing file in read+write mode a+ create file if it doesn't exist and open it in append mode '''
file_name="my_file.txt" f = open(file_name, 'a+') # open file in append mode f.write('python rules') f.close()
I hope this helps. [FYI am using python version 3.6.2]
Well, first of all, in Python there is no
! operator, that’d be
open would not fail silently either – it would throw an exception. And the blocks need to be indented properly – Python uses whitespace to indicate block containment.
Thus we get:
fn = input('Enter file name: ') try: file = open(fn, 'r') except IOError: file = open(fn, 'w')
Here’s a quick two-liner that I use to quickly create a file if it doesn’t exists.
if not os.path.exists(filename): open(filename, 'w').close()
input() implies Python 3, recent Python 3 versions have made the
IOError exception deprecated (it is now an alias for
OSError). So assuming you are using Python 3.3 or later:
fn = input('Enter file name: ') try: file = open(fn, 'r') except FileNotFoundError: file = open(fn, 'w')
I think this should work:
#open file for reading fn = input("Enter file to open: ") try: fh = open(fn,'r') except: # if file does not exist, create it fh = open(fn,'w')
Also, you incorrectly wrote
fh = open ( fh, "w") when the file you wanted open was
Be warned, each time the file is opened with this method the old data in the file is destroyed regardless of ‘w+’ or just ‘w’.
import os with open("file.txt", 'w+') as f: f.write("file is opened for business")
If you know the folder location and the filename is the only unknown thing,
if the folder location is also unknown
First let me mention that you probably don’t want to create a file object that eventually can be opened for reading OR writing, depending on a non-reproducible condition. You need to know which methods can be used, reading or writing, which depends on what you want to do with the fileobject.
That said, you can do it as That One Random Scrub proposed, using try: … except:. Actually that is the proposed way, according to the python motto “It’s easier to ask for forgiveness than permission”.
But you can also easily test for existence:
import os # open file for reading fn = raw_input("Enter file to open: ") if os.path.exists(fn): fh = open(fn, "r") else: fh = open(fn, "w")
Note: use raw_input() instead of input(), because input() will try to execute the entered text. If you accidently want to test for file “import”, you’d get a SyntaxError.