[Tutor] inserting path to open a file from a variable
richard kappler
richkappler at gmail.com
Thu May 28 21:29:47 CEST 2015
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.dietrich at sperrhaken.name> wrote:
> richard kappler <richkappler at 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 at python.org
> To unsubscribe or change subscription options:
> https://mail.python.org/mailman/listinfo/tutor
>
--
Windows assumes you are an idiot…Linux demands proof.
More information about the Tutor
mailing list