Python Forum

Full Version: How to "copy" a file in python?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
So I am trying to not use shutil or os libraries. So what i tried is:
    fileOriginal = open(filename, "rb")
    os.chdir(destination) #In this case destination is a full path.
    fileDuplicate = open(filename, "wb")
    fileDuplicate.write(fileOriginal)
    fileOriginal.close()
    fileDuplicate.close()
This is what i have so far. But this throws this error: 

TypeError: a bytes-like object is required, not '_io.BufferedReader'

How am I supposed to do it using this method. 
I need this to work for any file type.
fileDuplicate.write(fileOriginal.read())

fileDuplicate is an object. You can't just write it to a file. To get the content of a file object you have to call its method read()



Instead of changing the directory you can use os.path.join() method

>>> import os.path

>>> destination = "Programming/Pycode"

>>> file = "2en-adv.py"

>>> os.path.join(destination, file)
'Programming/Pycode/2en-adv.py'
fileDuplicate = open(filename, "wb")
Also, consider using a 'with' statement to open the files.

with open(filename, 'rb') as fileOriginal, open(os.path.join(destination, filename), 'wb') as fileDuplicate:
    fileDuplicate.write(fileOriginal.read())
This way Python closes the opened files once the with block is executed
Um, what does os.path.join do? I don't understand that part.
(Mar-29-2017, 08:38 AM)tannishpage Wrote: [ -> ]Um, what does os.path.join do? I don't understand that part.
Making a absolute path so Python can read it from file system.
>>> import os
>>> help(os.path.join)
Help on function join in module ntpath:

join(a, *p)
   Join two or more pathname components, inserting "\" as needed.
   If any component is an absolute path, all previous path components
   will be discarded.

>>> path = 'c:/music/app/'
>>> file_name = 'song.mp3'
>>> os.path.join(path, file_name)
'c:/music/app/song.mp3'

>>> # Linux
>>> path = 'music/app/'
>>> file_name = 'song.mp3'
>>> os.path.join(path, file_name)
'music/app/song.mp3'
Ok. Thanks. Your solution worked, and i understand it.