I found the problem, but the answer confuses me. If I run my script to open a file in Documents/MyScripts/fileMonitor which is where I'm doing my building and testing, with the variable rd1 (however created, my way and ConfigParser way both work) from within Documents/MyScripts/fileMonitor, the script fails with a
Traceback (most recent call last): File "21FileMonitor.py", line 28, in <module> file = open(rd1, 'r') IOError: [Errno 2] No such file or directory: 'Documents/MyScripts/fileMonitor/log.txt' but if I run the exact same script from the Home directory, it works fine, does exactly what I expected it to do (ie. opens the files). I thought it might be because because I used Doc... instead of ~/Doc... for my path, but I got the same traceback. curiouser and curiouser was, Richard On Thu, May 28, 2015 at 3:01 PM, Felix Dietrich < felix.dietr...@sperrhaken.name> wrote: > richard kappler <richkapp...@gmail.com> writes: > > > Now I've been tasked to change the script so that the script doesn't need > > to be in the same directory as the log file, which makes perfect sense. > > Furthermore, the path can't be hard coded into the script, but rather > > should read the installer should be able to edit a text file to specify > the > > paths to the read file (log from which we're extracting data) and the > write > > file (file to which we're send the extracted data). I thought this would > be > > a trivial exercise, but I'm stuck. > > An alternative way to configurate execution parameters is to pass the > filenames as arguments to your program which you can access via > /sys.argv/ (modules to consider: /getopt/, /optparser/): > > import sys > print sys.argv[0] # the first element is the script's name > print sys.argv[1] # second element first argument (e.g. rd) > print sys.argv[2] # third element second argument (e.g. wd) > > If you have these lines in a file "argv_test.py" try: > > python argv_test.py read_filename write_filename > > > Another good alternative for filters is to simply read from stdin and > output the results to stdout; then use the shell to redirect those > from/to the respective files: > > python filter.py <rdfile >wdfile > # < redirects stdin > # > redirects stdout > # or with a pipe and cat > cat rdfile | python filter.py > wdfile > > Within python stdin can be read via sys.stdin: > > import sys > for l in sys.stdin: > print l > > > The /ConfigParser/-Module provides a way to read and write configuration > files. > > > # read the config file to get file locations for a script > > conf = open('fileMonitor.conf', 'r') > > read_it = conf.read() > > > > for line in read_it.splitlines(): > > if line.startswith('rdfile:'): > > rd = line > > elif line.startswith('wrtfile:'): > > wrt = line > > Instead of reading all the content of a file into memory one can simply > iterate it and retrieve the contents line my line (I believe this way is > also considered more "pythonic"): > > conf = open('fileMonitor.conf', 'r') > for line in conf: > ... > > One more "pythonic" thing to do is to wrap the interaction with a file > in a /with/-block: that way file closing is ensured after one is done > with the file: > > with open('fileMonitor.conf', 'r') as conf: > for line in conf: > ... > > > > At the moment, I am, for example, opening the file to be read from with a > > simple > > > > file = open('log.txt', 'r') > > > > but I need to replace 'log.txt' with rd1 (path and file name to log.txt). > > > > And I'm stumped. rd1 and wrt1 exist, I can print them, and I get what I > > expect (path/filename) for example print rd1 gives > > me Documents/MyScripts/fileMonitor/log.txt > > > > But how in the heck do I get that into the open() statement? > > > > What I've tried (none worked): > > > > file = open(rd1, 'r') > > file = open('rd1', 'r') > > What do you mean by "none worked"? Did python respond with an error? > How did you figure that the calls to /open/ failed? > > Also: The first line opens a file having the path of the string the > variable /rd1/ currently holds (presumably > "Documents/MyScripts/fileMonitor/log.txt"). The second calls /open/ > with the string "rd1" causing /open/ to try and open a file with the > name rd1. > > 'r' will fail when the file does not exist. > > -- > Felix Dietrich > _______________________________________________ > Tutor maillist - Tutor@python.org > To unsubscribe or change subscription options: > https://mail.python.org/mailman/listinfo/tutor > -- Windows assumes you are an idiot…Linux demands proof. _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor