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

AltStyle によって変換されたページ (->オリジナル) /