New to Programming: TypeError: coercing to Unicode: need string or buffer, list found

Saran A ahlusar.ahluwalia at gmail.com
Thu Apr 2 08:46:57 EDT 2015


On Thursday, April 2, 2015 at 8:26:01 AM UTC-4, Chris Angelico wrote:
> On Thu, Apr 2, 2015 at 11:02 PM, Saran A <ahlusar.ahluwalia at gmail.com> wrote:
> > I understand this error message when I run this code. However, I am curious to know what the most pythonic way is to convert  the list to a string? I use Python 2.7.
> >
> 
> I don't think you actually want to convert a list into a string, here.
> Tell me if I'm understanding your code's intention correctly:
> 
> > The sample code that I am trying to run is:
> >
> > path = "/Users/Desktop/Projects/"
> > dirlist = os.listdir(path)
> > before = dict([(f, None) for f in os.listdir(dirlist)])
> 
> Start up and get a full list of pre-existing files.
> 
> > def main(dirlist):
> >     while True:
> >         time.sleep(10) #time between update check
> 
> Then, every ten seconds...
> 
> >     after = dict([(f, None) for f in os.listdir(dirlist)])
> >     added = [f for f in after if not f in before]
> 
> ... get a list of files, and if there are new ones...
> 
> >     if added:
> >         print('Successfully added new file - ready to validate')
> > if __name__ == "__main__":
> >     main()
> 
> ... print out a message.
> 
> If that's what you're trying to do, I would suggest using a directory
> notification system instead. Here's one that I use on Linux:
> 
> https://github.com/Rosuav/shed/blob/master/dirwatch.py
> 
> Here's another one, this time built for Windows:
> 
> https://github.com/Rosuav/shed/blob/master/senddir.py
> 
> But even if you absolutely have to poll, like that, you'll need to
> make a few code changes. The exception you're getting is symptomatic
> of just one problem with the code as published. My suspicion is that
> you just want to use listdir(path) rather than listdir(dirlist) - but
> if you want subdirectories, then you'll need to do things a bit
> differently (probably using os.walk instead).
> 
> Also: You say you're using Python 2.7. If you have no particular
> reason to use 2.7, you'll do better to jump to Python 3. Your code
> will probably run identically, when it's this simple.
> 
> ChrisA

@ChrisA - this is a smaller function that will take the most updated file. My intention is the following:

* Monitor a folder for files that are dropped throughout the day

* When a file is dropped in the folder the program should scan the file

o IF all the contents in the file have the same length (let's assume line length)

o THEN the file should be moved to a "success" folder and a text file written indicating the total number of records/lines/words processed

o IF the file is empty OR the contents are not all of the same length

o THEN the file should be moved to a "failure" folder and a text file written indicating the cause for failure (for example: Empty file or line 100 was not the same length as the rest).

Here is the code I have written:

import os
import time
import glob
import sys

def initialize_logger(output_dir):
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
     
    # create console handler and set level to info
    handler = logging.StreamHandler()
    handler.setLevel(logging.INFO)
    formatter = logging.Formatter("%(levelname)s - %(message)s")
    handler.setFormatter(formatter)
    logger.addHandler(handler)
 
    # create error file handler and set level to error
    handler = logging.FileHandler(os.path.join(output_dir, "error.log"),"w", encoding=None, delay="true")
    handler.setLevel(logging.ERROR)
    formatter = logging.Formatter("%(levelname)s - %(message)s")
    handler.setFormatter(formatter)
    logger.addHandler(handler)

    # create debug file handler and set level to debug
    handler = logging.FileHandler(os.path.join(output_dir, "all.log"),"w")
    handler.setLevel(logging.DEBUG)
    formatter = logging.Formatter("%(levelname)s - %(message)s")
    handler.setFormatter(formatter)
    logger.addHandler(handler)

#Helper Functions for the Success and Failure Folder Outcomes, respectively

#checks the length of the file
    def file_len(filename
        with open(filename) as f:
            for i, l in enumerate(f):
                pass
            return i + 1

#copies file to new destination

    def copyFile(src, dest):
        try:
            shutil.copy(src, dest)
        # eg. src and dest are the same file
        except shutil.Error as e:
            print('Error: %s' % e)
        # eg. source or destination doesn't exist
        except IOError as e:
            print('Error: %s' % e.strerror)

#Failure Folder

def move_to_failure_folder_and_return_error_file():
    os.mkdir('Failure')
    copyFile(filename, 'Failure')
    initialize_logger('rootdir/Failure')
    logging.error("Either this file is empty or the lines")
     
# Success Folder Requirement
             
def move_to_success_folder_and_read(file):
    os.mkdir('Success')
    copyFile(filename, 'Success')
    print("Success", file)
    return file_len()


#This simply checks the file information by name

def fileinfo(file):
    filename = os.path.basename(file)
    rootdir = os.path.dirname(file)
    lastmod = time.ctime(os.path.getmtime(file))
    creation = time.ctime(os.path.getctime(file))
    filesize = os.path.getsize(file)
    return filename, rootdir, lastmod, creation, filesize

if __name__ == '__main__':
   import sys
   validate_files(sys.argv[1:])



More information about the Python-list mailing list