File-writing not working in Windows?

T

tdahsu

All,

I have the following code:
for fileTarget in dircache.listdir("directory"):
(dirName, fileName) = os.path.split(fileTarget)
f = open(fileTarget).readlines()
copying = False
for i in range(len(f)):
for x in range (0,24,1):
if (re.search(self.Info[x][3], f)):
#If we have a match for our start of section...
if (self.Info[x][2] == True):
#And it's a section we care about...
copying =
True #Let's start copying the lines out
to the temporary file...
if (os.name == "posix"):
if (self.checkbox25.GetValue() ==
False):
tempfileName = "tempdir/" +
self.Info[x][0] + "_tmp_" + fileName + ".txt"
else:
tempfileName =
self.textctrl07.GetValue() + "/" + self.Info[x][0] + "_xyz.txt"
else:
if (self.checkbox25.GetValue() ==
False):
tempfileName = "tempdir\\" +
self.Info[x][0] + "_tmp_" + fileName + ".txt"
else:
tempfileName =
self.textctrl07.GetValue() + "\\" + self.Info[x][0] + "_xyz.txt"
else:
copying = False
if (re.search(self.Info[x][4], f)):
#Now we've matched the end of our section...
copying =
False #So let's stop copying out to
the temporary file...
if (copying == True):
g = open(tempfileName,
'a') #Open that file in append mode...

g.write(f) #Write the line...
g.close()

This code works PERFECTLY in Linux. Where I have a match in the file
I'm processing, it gets cut out from the start of the match until the
end of the match, and written to the temporary file in tempdir.

It does not work in Windows. It does not create or write to the
temporary file AT ALL. It creates the tempdir directory with no
problem.

Here's the kicker: it works perfectly in Windows if Windows is running
in VMware on a Linux host! (I assume that that's because VMware is
passing some call to the host.)

Can anyone tell me what it is that I'm missing which would prevent the
file from being created on Windows natively?

I'm sorry I can't provide any more of the code, and I know that that
will hamper your efforts in helping me, so I apologise up front.

Assumptions:
You can assume self.checkbox25.GetValue() is always false for now, and
self.Info[x][0] contains a two character string like "00" or "09" or
"14". There is always a match in the fileTarget, so self.Info[x][2]
will always be true at some point, as will self.Info[x][4]. I am
cutting an HTML file at predetermined comment sections, and I have
control over the HTML files that are being cut. (So I can force the
file to match what I need it to match if necessary.)

I hope however that it's something obvious that a Python guru here
will be able to spot and that this n00b is missing!

Thanks!
 
J

jay graves

On Jun 6, 10:18 am, (e-mail address removed) wrote:
This code works PERFECTLY in Linux. Where I have a match in the file
I'm processing, it gets cut out from the start of the match until the
end of the match, and written to the temporary file in tempdir.
It does not work in Windows. It does not create or write to the
temporary file AT ALL. It creates the tempdir directory with no
problem.

In general, I don't use string concatenation when building paths.
Especially on scripts that are meant to run on multiple platforms.

Here's the kicker: it works perfectly in Windows if Windows is running
in VMware on a Linux host! (I assume that that's because VMware is
passing some call to the host.)

probably a red herring.
Can anyone tell me what it is that I'm missing which would prevent the
file from being created on Windows natively?

Get rid of the 'posix' check and use os.path.join to create
'tempfileName' and see if it works.

HTH.
....
Jay Graves
 
T

tdahsu

On Jun 6, 10:18 am, (e-mail address removed) wrote:


In general, I don't use string concatenation when building paths.
Especially on scripts that are meant to run on multiple platforms.


probably a red herring.


Get rid of the 'posix' check and use os.path.join to create
'tempfileName' and see if it works.

HTH.
...
Jay Graves

Jay,

Thank you for your answer. I have researched os.path.join. I have
changed the code to read as follows:

if (self.checkbox25.GetValue() == False):
initialFileName = self.Info[x][0] + "_tmp_" + fileName + ".txt"
tempfileName = os.path.join("proctemp", initialFileName)
else:
initialFileName = self.Info[x][0] + "_xyz.txt"
tempfileName = os.path.join("proctemp", initialFileName)

this still works in Linux; it does not work in Windows.

I am thinking that the "g.open(tempFileName, 'a')" command is the
issue. Is there anything different about opening a file in Windows?
Does Windows understand "append", or would I have to do control checks
for seeing if the file is created and then appending?
 
J

jay graves

I am thinking that the "g.open(tempFileName, 'a')" command is the
issue. Is there anything different about opening a file in Windows?
Does Windows understand "append", or would I have to do control checks
for seeing if the file is created and then appending?

Does your file have embedded nulls?
Try opening it in binary mode.

g.open(tempFileName,'ab')

Note that this will turn off Universal newline support.

Barring that, can you distill the problem down by writing a script
that exhibits the behavior without the rest of your program?

....
Jay
 
T

tdahsu

Does your file have embedded nulls?
Try opening it in binary mode.

g.open(tempFileName,'ab')

Note that this will turn off Universal newline support.

Barring that, can you distill the problem down by writing a script
that exhibits the behavior without the rest of your program?

...
Jay

Jay,

This did not make a difference in my script. However, I did what you
suggested, and tried the simple script it Windows, and it works as it
should.

(It's really annoying because it works on the Mac and Linux! (I just
tested my script on the Mac as well.) It only doesn't work on
Windows, though clearly the file processing I am doing SHOULD work.)

Now I have to find out what it is about my code that's causing the
problem... :-(
 
J

jay graves

This did not make a difference in my script. However, I did what you
suggested, and tried the simple script it Windows, and it works as it
should.
(It's really annoying because it works on the Mac and Linux! (I just
tested my script on the Mac as well.) It only doesn't work on
Windows, though clearly the file processing I am doing SHOULD work.)

Is there a global exception handler somewhere in your code that could
be eating an error that only happens on windows? (something weird
like file permissions.) I'm really at a loss.

Sorry.

....
Jay
 
J

John Machin


[code snipped]
This code works PERFECTLY in Linux. Where I have a match in the file
I'm processing, it gets cut out from the start of the match until the
end of the match, and written to the temporary file in tempdir.

It does not work in Windows. It does not create or write to the
temporary file AT ALL. It creates the tempdir directory with no
problem.

Here's the kicker: it works perfectly in Windows if Windows is running
in VMware on a Linux host! (I assume that that's because VMware is
passing some call to the host.)

Can anyone tell me what it is that I'm missing which would prevent the
file from being created on Windows natively?

I'm sorry I can't provide any more of the code, and I know that that
will hamper your efforts in helping me, so I apologise up front.

Assumptions:
You can assume self.checkbox25.GetValue() is always false for now, and
self.Info[x][0] contains a two character string like "00" or "09" or
"14". There is always a match in the fileTarget, so self.Info[x][2]
will always be true at some point, as will self.Info[x][4]. I am
cutting an HTML file at predetermined comment sections, and I have
control over the HTML files that are being cut. (So I can force the
file to match what I need it to match if necessary.)

Assume nothing. Don't believe anyone who says "always". Insert some
print statements and repr() calls to show what's actually there.
I hope however that it's something obvious that a Python guru here
will be able to spot and that this n00b is missing!

*IF* the problem is in the code, it would be easier to spot if you had
removed large chunks of indentation before posting.

Less is more: change "if (foo == 2):" to "if foo == 2:", "foo == True"
to "foo", and "foo == False" to "not foo".

Browse http://www.python.org/dev/peps/pep-0008/

HTH,
John
 
I

Ivan

John Machin ?????:
On Jun 7, 1:18 am, (e-mail address removed) wrote:

Assume nothing. Don't believe anyone who says "always". Insert some
print statements and repr() calls to show what's actually there.



*IF* the problem is in the code, it would be easier to spot if you had
removed large chunks of indentation before posting.

Less is more: change "if (foo == 2):" to "if foo == 2:", "foo == True"
to "foo", and "foo == False" to "not foo".

Browse http://www.python.org/dev/peps/pep-0008/

HTH,
John
Hello,
I tried os.path.join() under Windows XP and everything works as
expected. The problem is in your script. You may use logger or use
additional checks (John Machin wrote about this practice).

TBRDs,
Ivan
 
L

Lie

All,

I have the following code:
           for fileTarget in dircache.listdir("directory"):
                (dirName, fileName) = os.path.split(fileTarget)
                f = open(fileTarget).readlines()
                copying = False
                for i in range(len(f)):
                    for x in range (0,24,1):
                        if (re.search(self.Info[x][3], f)):
#If we have a match for our start of section...
                            if (self.Info[x][2] == True):
#And it's a section we care about...
                                copying =
True                              #Let's start copying the lines out
to the temporary file...
                                if (os.name == "posix"):
                                    if (self.checkbox25.GetValue() ==
False):
                                        tempfileName = "tempdir/" +
self.Info[x][0] + "_tmp_" + fileName + ".txt"
                                    else:
                                        tempfileName =
self.textctrl07.GetValue() + "/" + self.Info[x][0] + "_xyz.txt"
                                else:
                                    if (self.checkbox25.GetValue() ==
False):
                                        tempfileName = "tempdir\\" +
self.Info[x][0] + "_tmp_" + fileName + ".txt"
                                    else:
                                        tempfileName =
self.textctrl07.GetValue() + "\\" + self.Info[x][0] + "_xyz.txt"
                            else:
                                copying = False
                        if (re.search(self.Info[x][4], f)):
#Now we've matched the end of our section...
                            copying =
False                                 #So let's stop copying out to
the temporary file...
                    if (copying == True):
                        g = open(tempfileName,
'a')                     #Open that file in append mode...

g.write(f)                                       #Write the line...
                        g.close()

This code works PERFECTLY in Linux.  Where I have a match in the file
I'm processing, it gets cut out from the start of the match until the
end of the match, and written to the temporary file in tempdir.

It does not work in Windows.  It does not create or write to the
temporary file AT ALL.  It creates the tempdir directory with no
problem.

Here's the kicker: it works perfectly in Windows if Windows is running
in VMware on a Linux host!  (I assume that that's because VMware is
passing some call to the host.)

Can anyone tell me what it is that I'm missing which would prevent the
file from being created on Windows natively?

I'm sorry I can't provide any more of the code, and I know that that
will hamper your efforts in helping me, so I apologise up front.

Assumptions:
You can assume self.checkbox25.GetValue() is always false for now, and
self.Info[x][0] contains a two character string like "00" or "09" or
"14".  There is always a match in the fileTarget, so self.Info[x][2]
will always be true at some point, as will self.Info[x][4].  I am
cutting an HTML file at predetermined comment sections, and I have
control over the HTML files that are being cut.  (So I can force the
file to match what I need it to match if necessary.)

I hope however that it's something obvious that a Python guru here
will be able to spot and that this n00b is missing!

Thanks!


Well, not to be rude, but that's quite a spaghetti code, some of the
guilt, however, was for the mailing program that cuts 80+ lines.
Others was the use of things like "for i in range(len(f)):" or "if (a
== True)".

Try checking whether you're trying to write to a path like r"\dir
\file.txt" or r"dir\file.txt" instead of r"C:\dir\file.txt" in
Windows.

If that doesn't solve the problem, tell us a few things:
- Any error messages? Or simply nothing is written out?
- Has a blank file get created?
 
T

tdahsu

I have the following code:
           for fileTarget in dircache.listdir("directory"):
                (dirName, fileName) = os.path.split(fileTarget)
                f = open(fileTarget).readlines()
                copying = False
                for i in range(len(f)):
                    for x in range (0,24,1):
                        if (re.search(self.Info[x][3], f)):
#If we have a match for our start of section...
                            if (self.Info[x][2] == True):
#And it's a section we care about...
                                copying =
True                              #Let's start copying the lines out
to the temporary file...
                                if (os.name == "posix"):
                                    if (self.checkbox25.GetValue() ==
False):
                                        tempfileName = "tempdir/" +
self.Info[x][0] + "_tmp_" + fileName + ".txt"
                                    else:
                                        tempfileName =
self.textctrl07.GetValue() + "/" + self.Info[x][0] + "_xyz.txt"
                                else:
                                    if (self.checkbox25.GetValue() ==
False):
                                        tempfileName = "tempdir\\" +
self.Info[x][0] + "_tmp_" + fileName + ".txt"
                                    else:
                                        tempfileName =
self.textctrl07.GetValue() + "\\" + self.Info[x][0] + "_xyz.txt"
                            else:
                                copying = False
                        if (re.search(self.Info[x][4], f)):
#Now we've matched the end of our section...
                            copying =
False                                 #So let's stop copying out to
the temporary file...
                    if (copying == True):
                        g = open(tempfileName,
'a')                     #Open that file in append mode...

g.write(f)                                       #Write the line...
                        g.close()

This code works PERFECTLY in Linux.  Where I have a match in the file
I'm processing, it gets cut out from the start of the match until the
end of the match, and written to the temporary file in tempdir.
It does not work in Windows.  It does not create or write to the
temporary file AT ALL.  It creates the tempdir directory with no
problem.
Here's the kicker: it works perfectly in Windows if Windows is running
in VMware on a Linux host!  (I assume that that's because VMware is
passing some call to the host.)
Can anyone tell me what it is that I'm missing which would prevent the
file from being created on Windows natively?
I'm sorry I can't provide any more of the code, and I know that that
will hamper your efforts in helping me, so I apologise up front.
Assumptions:
You can assume self.checkbox25.GetValue() is always false for now, and
self.Info[x][0] contains a two character string like "00" or "09" or
"14".  There is always a match in the fileTarget, so self.Info[x][2]
will always be true at some point, as will self.Info[x][4].  I am
cutting an HTML file at predetermined comment sections, and I have
control over the HTML files that are being cut.  (So I can force the
file to match what I need it to match if necessary.)
I hope however that it's something obvious that a Python guru here
will be able to spot and that this n00b is missing!

Well, not to be rude, but that's quite a spaghetti code, some of the
guilt, however, was for the mailing program that cuts 80+ lines.
Others was the use of things like "for i in range(len(f)):" or "if (a
== True)".

Try checking whether you're trying to write to a path like r"\dir
\file.txt" or r"dir\file.txt" instead of r"C:\dir\file.txt" in
Windows.

If that doesn't solve the problem, tell us a few things:
- Any error messages? Or simply nothing is written out?
- Has a blank file get created?- Hide quoted text -

- Show quoted text -


Thanks to everyone for the help. I really do appreciate your
suggestions and time; again I apologise for not being able to give you
all the code to diagnose. I understand that it made this more
difficult and thank you for the input!

The error was not with the script.

The error was with the HTML that was being parsed! It's the last
thing I considered to check, and where I should have started.

John, thank you for the link to the style guide. I can see its use
and will make my code conform to the standards.

Thanks again to everyone!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top