def filecopy(fName1, fName2):
  srcF = open(fName1)
  dstF = open(fName2, "w")
  while 1:
    ln = srcF.readline()
    if not ln:
      break
    dstF.write(ln)
  dstF.close()
  srcF.close()

Die denkbare Alternative

def filecopy(fName1, fName2):
  stuff = open(fName1).read()
  dstF = open(fName2, "w")
  dstF.write(stuff)
  dstF.close()

hat den Nachteil, exzessiven Hauptspeicherverbrauchs, dafür geht das auch mit Binärdateien (genau genommen geht die erste Version unter nicht ganz irren Betriebssystemen auch mit Binärdateien, aber dann kann der Speicherverbrauch auch exzessiv sein). Recht universell ist schließlich

def filecopy(fName1, fName2):
  bufSz = 1024
  srcF = open(fName1, "rb")
  dstF = open(fName2, "wb")
  while 1:
    buffer = srcF.read(bufSz)
    if not buffer:
      break
    dstF.write(buffer)
  dstF.close()
  srcF.close()

– dabei ist das b ein unter vernünfigen Systemen ignorierter Hinweis für Windows, die Finger von unseren Daten zu lassen. Bei Textdateien ist der nicht wichtig (und kann sogar schaden), bei Binärdateien ist er (unter Windows) lebenswichtig.