By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
443,908 Members | 1,850 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 443,908 IT Pros & Developers. It's quick & easy.

File-writing not working in Windows?

P: n/a
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[i])):
#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[i])):
#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[i]) #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!
Jun 27 '08 #1
Share this Question
Share on Google+
9 Replies


P: n/a
On Jun 6, 10:18 am, tda...@gmail.com wrote:
<snippage>
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
Jun 27 '08 #2

P: n/a
On Jun 6, 11:35*am, jay graves <jaywgra...@gmail.comwrote:
On Jun 6, 10:18 am, tda...@gmail.com wrote:
<snippage>
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
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?
Jun 27 '08 #3

P: n/a
On Jun 6, 1:22 pm, tda...@gmail.com wrote:
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
Jun 27 '08 #4

P: n/a
On Jun 6, 2:58*pm, jay graves <jaywgra...@gmail.comwrote:
On Jun 6, 1:22 pm, tda...@gmail.com wrote:
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
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... :-(
Jun 27 '08 #5

P: n/a
On Jun 6, 3:19 pm, tda...@gmail.com wrote:
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


Jun 27 '08 #6

P: n/a
On Jun 7, 1:18 am, tda...@gmail.com wrote:
All,
[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
Jun 27 '08 #7

P: n/a

John Machin ?????:
On Jun 7, 1:18 am, tda...@gmail.com wrote:

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
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

Jun 27 '08 #8

P: n/a
Lie
On Jun 6, 10:18*pm, tda...@gmail.com wrote:
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[i])):
#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[i])):
#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[i]) * * * * * * * * * * * * * * * * * * * #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?
Jun 27 '08 #9

P: n/a
On Jun 8, 4:11*am, Lie <Lie.1...@gmail.comwrote:
On Jun 6, 10:18*pm, tda...@gmail.com wrote:


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[i])):
#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[i])):
#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[i]) * * * * * * * * * * * * * * * * * * * #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?- 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!
Jun 27 '08 #10

This discussion thread is closed

Replies have been disabled for this discussion.