0

Why can't I use sourcecode = "myFile.txt" f = open(sourcecode, mode='rb') to open my file and compress it? This is all pretty new to me. I would be glad if some of you could give me some advice on how to solve the problem.

def compress(uncompressed):
    """Compress a string to a list of output symbols."""

    sourcecode = "myFile.txt"
    f = open(sourcecode, mode='rb')   

    # Build the dictionary.
    dict_size = 256
    dictionary = dict((chr(i), chr(i)) for i in xrange(dict_size))
    # in Python 3: dictionary = {chr(i): chr(i) for i in range(dict_size)}

    w = ""
    result = []
    for c in uncompressed:
        wc = w + c
        if wc in dictionary:
            w = wc
        else:
            result.append(dictionary[w])
            # Add wc to the dictionary.
            dictionary[wc] = dict_size
            dict_size += 1
            w = c

    # Output the code for w.
    if w:
        result.append(dictionary[w])
    return result



def decompress(compressed):
    """Decompress a list of output ks to a string."""

    # Build the dictionary.
    dict_size = 256
    dictionary = dict((chr(i), chr(i)) for i in xrange(dict_size))
    # in Python 3: dictionary = {chr(i): chr(i) for i in range(dict_size)}

    w = result = compressed.pop(0)
    for k in compressed:
        if k in dictionary:
            entry = dictionary[k]
        elif k == dict_size:
            entry = w + w[0]
        else:
            raise ValueError('Bad compressed k: %s' % k)
        result += entry

        # Add w+entry[0] to the dictionary.
        dictionary[dict_size] = w + entry[0]
        dict_size += 1

        w = entry
    return result

compressed = compress(f)
print (compressed)
decompressed = decompress(compressed)
print (decompressed)

I found this code at: http://rosettacode.org/wiki/LZW_compression#Python

  • 1
    What is the problem? What error does python give you when you try to open the file? Could it be the problem that you don't close the file at the end of `compress`? – Cantfindname Jun 02 '16 at 14:21
  • 2
    Do you get an error while opening file? Could you post it here? Also you don't seem to call f.read() or f.write() anywhere, did you forget some other important piece? – Tomasz Plaskota Jun 02 '16 at 14:23
  • File "/Users/Har/LZW2.py", line 57, in compressed = compress(d) NameError: name 'f' is not defined – Haris Saric Jun 02 '16 at 14:26
  • The code in the link makes sense. Your modifications doesn't make any sense. There's no need to open the file inside the `compress` method. Read the file first, and then pass the content to `compress` – Håken Lid Jun 02 '16 at 14:29

1 Answers1

0

One problem is the fact that you open the file inside the compress function. That means that f is not visible outside the function, and therefore calling compress(f) will give you an error that it does not find f. The correct syntax would be to move the lines sourcecode = "myFile.txt" and f = open(sourcecode, mode='rb') there, so that you have:

sourcecode = "myFile.txt"
f = open(sourcecode, mode='rb') 
compressed = compress(f.read())
f.close() # don't forget to close open files

Notice the f.read() when calling compress. f by itself is a file descriptor, f.read() is the one that returns the contents of the file as a string to be given as an argument to compress()

Cantfindname
  • 2,008
  • 1
  • 17
  • 30