Reading text file with wierd file extension?

L

Lionel

Hi Folks, Python newbie here.

I'm trying to open (for reading) a text file with the following
filenaming convension:

"MyTextFile.slc.rsc"

My code is as follows:

Filepath = "C:\\MyTextFile.slc.rsc"
FileH = open(Filepath)

The above throws an IOError exception. On a hunch I changed the
filename (only the filename) and tried again:

Filepath = "C:\\MyTextFile.txt"
FileH = open(Filepath)

The above works well. I am able to open the file and read it's
contents. I assume to read a file in text file "mode" the parameter is
scanned for a ".txt" extension, otherwise the Python runtime doesn't
know what version of "open(...)" to invoke. How do I pass the original
filename (MyTextFile.slc.rsc) and get Python to open it as a text
file? Thanks in advance everyone!
 
M

Mike Driscoll

Hi Folks, Python newbie here.

I'm trying to open (for reading) a text file with the following
filenaming convension:

"MyTextFile.slc.rsc"

My code is as follows:

Filepath = "C:\\MyTextFile.slc.rsc"
FileH = open(Filepath)

The above throws an IOError exception. On a hunch I changed the
filename (only the filename) and tried again:

Filepath = "C:\\MyTextFile.txt"
FileH = open(Filepath)

The above works well. I am able to open the file and read it's
contents. I assume to read a file in text file "mode" the parameter is
scanned for a ".txt" extension, otherwise the Python runtime doesn't
know what version of "open(...)" to invoke. How do I pass the original
filename (MyTextFile.slc.rsc) and get Python to open it as a text
file? Thanks in advance everyone!

The extension shouldn't matter. I tried creating a file with the same
extension as yours and Python 2.5.2 opened it and read it no problem.
I tried it in IDLE and with Wing on Windows XP. What are you using?
What's the complete traceback?

Mike
 
S

Simon Brunning

2009/2/2 Lionel said:
Hi Folks, Python newbie here.

I'm trying to open (for reading) a text file with the following
filenaming convension:

"MyTextFile.slc.rsc"

Some kind of a resource fork, perhaps? Where did the file come from?

Python doesn't do anything magic with filenames, so this must be some
sort of a fileysytem oddity, I think.
 
L

Lionel

The extension shouldn't matter. I tried creating a file with the same
extension as yours and Python 2.5.2 opened it and read it no problem.
I tried it in IDLE and with Wing on Windows XP. What are you using?
What's the complete traceback?

Mike- Hide quoted text -

- Show quoted text -

Hi Mike,

maybe it's not a "true" text file? Opening it in Microsoft Notepad
gives an unformatted view of the file (text with no line wrapping,
just the end-of-line square box character followed by more text, end-
of-line character, etc). Wordpad opens it properly i.e. respects the
end-of-line wrapping. I'm unsure of how these files are being
generated, I was just given them and told they wanted to be able to
read them.

How do I collect the traceback to post it?
 
L

Lionel

Hi Mike,

maybe it's not a "true" text file? Opening it in Microsoft Notepad
gives an unformatted view of the file (text with no line wrapping,
just the end-of-line square box character followed by more text, end-
of-line character, etc). Wordpad opens it properly i.e. respects the
end-of-line wrapping. I'm unsure of how these files are being
generated, I was just given them and told they wanted to be able to
read them.

How do I collect the traceback to post it?- Hide quoted text -

- Show quoted text -

Sorry, I forgot to mention I'm using Python 2.5 and the Python IDLE.
 
D

Diez B. Roggisch

Hi Mike,
maybe it's not a "true" text file? Opening it in Microsoft Notepad
gives an unformatted view of the file (text with no line wrapping,
just the end-of-line square box character followed by more text, end-
of-line character, etc). Wordpad opens it properly i.e. respects the
end-of-line wrapping. I'm unsure of how these files are being
generated, I was just given them and told they wanted to be able to
read them.


Sounds like a unix-line-ended textfile. Python has no problems reading
these, and frankly I'm a bit wondering why you have that IOError -but
then, on windows *anything* is possible.

You can try to open the file using the "rb" flag, which opens it in binary.

However, Python doesn't care about any extensions, that must be
something else you did different.
> How do I collect the traceback to post it?

Copy and paste from the console or wherever you run the script?

Diez
 
M

Mike Driscoll

Hi Mike,

maybe it's not a "true" text file? Opening it in Microsoft Notepad
gives an unformatted view of the file (text with no line wrapping,
just the end-of-line square box character followed by more text, end-
of-line character, etc). Wordpad opens it properly i.e. respects the
end-of-line wrapping. I'm unsure of how these files are being
generated, I was just given them and told they wanted to be able to
read them.

How do I collect the traceback to post it?

The traceback should look something like this fake one:

Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
raise IOError
IOError

Just copy and paste it in your next message. The other guys are
probably right in that it is a line ending issue, but as they and I
have said, Python shouldn't care (and doesn't on my machine).

Mike
 
L

Lionel

The traceback should look something like this fake one:

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    raise IOError
IOError

Just copy and paste it in your next message. The other guys are
probably right in that it is a line ending issue, but as they and I
have said, Python shouldn't care (and doesn't on my machine).

Mike- Hide quoted text -

- Show quoted text -

Okay, I think I see what's going on. My class takes a single parameter
when it is instantiated...the file path of the data file the user
wants to open. This is of the form "someFile.slc". In the same
directory of "someFile.slc" is a resource file that (like a file
header) contains a host of parameters associated with the data file.
The resource file is of the form "someFile.slc.rsc". So, when the user
creates an instance of my class which, it invokes the __init__ method
where I add the ".rsc" extension to the original filename/path
parameter that was passed to the class "constructor". For example:

Note: try-catch blocks ommitted.

class MyUtilityClass:
def __init__(self, DataFilepath):
Resourcepath = DataFilepath + ".rsc"
DataFileH = open(DataFilepath)
ResourceFileH = open(Resourcepath)


Invoking this from the Python shell explicitly is no problem i.e.
"TestH = open("C:\\TestResourceFile.slc.rsc") works. BUT...something
is lost when I append the ".rsc" extension to the DataFilePath
parameter as above. When the __init__ method is invoked, Python will
open the data file but generates the exception with the "open
(Resourcepath)" instruction. I think it is somehow related to the
backslashes but I'm not entirely sure of this. Any ideas?

Thanks for the help folks.
 
D

Diez B. Roggisch

Lionel said:
Okay, I think I see what's going on. My class takes a single parameter
when it is instantiated...the file path of the data file the user
wants to open. This is of the form "someFile.slc". In the same
directory of "someFile.slc" is a resource file that (like a file
header) contains a host of parameters associated with the data file.
The resource file is of the form "someFile.slc.rsc". So, when the user
creates an instance of my class which, it invokes the __init__ method
where I add the ".rsc" extension to the original filename/path
parameter that was passed to the class "constructor". For example:

Note: try-catch blocks ommitted.

class MyUtilityClass:
def __init__(self, DataFilepath):
Resourcepath = DataFilepath + ".rsc"
DataFileH = open(DataFilepath)
ResourceFileH = open(Resourcepath)


Invoking this from the Python shell explicitly is no problem i.e.
"TestH = open("C:\\TestResourceFile.slc.rsc") works. BUT...something
is lost when I append the ".rsc" extension to the DataFilePath
parameter as above. When the __init__ method is invoked, Python will
open the data file but generates the exception with the "open
(Resourcepath)" instruction. I think it is somehow related to the
backslashes but I'm not entirely sure of this. Any ideas?

This is written very slowly, so you can read it better:

Please post the traceback.

Diez
 
L

Lionel

This is written very slowly, so you can read it better:

Please post without sarcasm.


This is the output from my Python shell:
'C:\\C8Example1.slc.rsc'

It seems to run without trouble. However, here is the offending code
in my class (followed by console output):

class C8DataType:

def __init__(self, DataFilepath):

try:
DataFH = open(DataFilepath, "rb")

except IOError, message:
# Error opening file.
print(message)
return None

ResourceFilepath = DataFilepath + ".src"

print(DataFilepath)
print(ResourceFilepath)

# Try to open resource file, catch exception:
try:
ResourceFH = open(ResourceFilepath)

except IOError, message:
# Error opening file.
print(message)
print("Error opening " + ResourceFilepath)
DataFH.close()
return None

Console output when invoking as "someObject = C8DataType("C:\
\C8Example1.slc")" :

C:\C8Example1.slc
C:\C8Example1.slc.src
[Errno 2] No such file or directory: 'C:\\C8Example1.slc.src'
Error opening C:\C8Example1.slc.src


Thank you
 
J

John Machin

This is written very slowly, so you can read it better:

Please post the traceback.

*AND* please post the text of the IOError message

*AND* please do yourself a favour and move your files out of the root
directory into a directory with a meaningful name
 
M

Mike Driscoll

This is written very slowly, so you can read it better:

Please post without sarcasm.

This is the output from my Python shell:

'C:\\C8Example1.slc'>>> ResourcefilePath

'C:\\C8Example1.slc.rsc'

It seems to run without trouble. However, here is the offending code
in my class (followed by console output):

class C8DataType:

    def __init__(self, DataFilepath):

        try:
            DataFH = open(DataFilepath, "rb")

        except IOError, message:
            # Error opening file.
            print(message)
            return None

        ResourceFilepath = DataFilepath + ".src"

        print(DataFilepath)
        print(ResourceFilepath)

        # Try to open resource file, catch exception:
        try:
            ResourceFH = open(ResourceFilepath)

        except IOError, message:
            # Error opening file.
            print(message)
            print("Error opening " + ResourceFilepath)
            DataFH.close()
            return None

Console output when invoking as "someObject = C8DataType("C:\
\C8Example1.slc")" :

C:\C8Example1.slc
C:\C8Example1.slc.src
[Errno 2] No such file or directory: 'C:\\C8Example1.slc.src'
Error opening C:\C8Example1.slc.src

Thank you
Lionel schrieb:
This is written very slowly, so you can read it better:
Please post the traceback.
Diez- Hide quoted text -
- Show quoted text -

Well, if I understand your code correctly, you pass in a filename that
exists, then you append an extension to it and expect that to change
the file's name. This doesn't work, as you only changed the string,
not the filename in the file system itself. You can probably use
os.rename() to do it. Then it should be able to open it.

Mike
 
L

Lionel

On Feb 2, 1:07 pm, "Diez B. Roggisch" <[email protected]> wrote:
This is written very slowly, so you can read it better:
Please post without sarcasm.
This is the output from my Python shell:
'C:\\C8Example1.slc'>>> ResourcefilePath

It seems to run without trouble. However, here is the offending code
in my class (followed by console output):
class C8DataType:
    def __init__(self, DataFilepath):
        try:
            DataFH = open(DataFilepath, "rb")
        except IOError, message:
            # Error opening file.
            print(message)
            return None
        ResourceFilepath = DataFilepath + ".src"
        print(DataFilepath)
        print(ResourceFilepath)
        # Try to open resource file, catch exception:
        try:
            ResourceFH = open(ResourceFilepath)
        except IOError, message:
            # Error opening file.
            print(message)
            print("Error opening " + ResourceFilepath)
            DataFH.close()
            return None
Console output when invoking as "someObject = C8DataType("C:\
\C8Example1.slc")" :
C:\C8Example1.slc
C:\C8Example1.slc.src
[Errno 2] No such file or directory: 'C:\\C8Example1.slc.src'
Error opening C:\C8Example1.slc.src
Thank you

Well, if I understand your code correctly, you pass in a filename that
exists, then you append an extension to it and expect that to change
the file's name. This doesn't work, as you only changed the string,
not the filename in the file system itself. You can probably use
os.rename() to do it. Then it should be able to open it.

Mike- Hide quoted text -

- Show quoted text -

Hello Mike,

I'm sorry, I'm not making myself clear. I have two files in my root
directory: "C8Example1.slc" and "C8Example1.slc.rsc". (They are just
in the root directory for testing for the time being). The ".slc" file
contains the data and the ".slc.rsc" file contains the info necessary
to extract it (datatype, width, height, etc). I know a priori that the
header file will always be in the same directory and have the same
name as the data file with the exception that it will have ".rsc"
appended to its name. Therefore, when the user passes the data file
name and path as a string to the class, I check the parameter by
seeing if I can read to that filepath. If so, I simply add ".rsc" to
the end of the parameter string and try to read to that new filepath/
name in order to acquire the header information. This works when
typing it directly into the shell script (see above), but not when
coded in my class.

The IOError is printed above, but being a newbie I'm unsure of how to
see the traceback. I've only been using these tools for a couple of
days.
 
L

Lionel

Don't you mean ".rsc"?

Good Grief!!! That's It!! I've been staring at it all day and I didn't
see it.

I'm sorry I've wasted everyone's time. This is bloody embarassing.
Amateur night.

Thank you for the help everyone.

-L
 
M

MRAB

Lionel said:
This is written very slowly, so you can read it better:

Please post without sarcasm.


This is the output from my Python shell:

'C:\\C8Example1.slc.rsc'
Here the extension is '.rsc' ...
It seems to run without trouble. However, here is the offending code
in my class (followed by console output):

class C8DataType:

def __init__(self, DataFilepath):

try:
DataFH = open(DataFilepath, "rb")

except IOError, message:
# Error opening file.
print(message)
return None

ResourceFilepath = DataFilepath + ".src"
.... but here the extension is '.src'.

Is that the problem.
print(DataFilepath)
print(ResourceFilepath)

# Try to open resource file, catch exception:
try:
ResourceFH = open(ResourceFilepath)

except IOError, message:
# Error opening file.
print(message)
print("Error opening " + ResourceFilepath)
DataFH.close()
return None

Console output when invoking as "someObject = C8DataType("C:\
\C8Example1.slc")" :

C:\C8Example1.slc
C:\C8Example1.slc.src
[Errno 2] No such file or directory: 'C:\\C8Example1.slc.src'
Error opening C:\C8Example1.slc.src
[snip]
It can't find "C:\C8Example1.slc.src", but I think you intended
"C:\C8Example1.slc.rsc".
 
L

Lionel

The extension you used in the interactive shell differs from the one
you used in the class code (i.e. "rsc" vs "src").

Yes, I see the problem now. Thank you everyone!

-L
 
R

Rhodri James

[Quoting restored for reduced


On Usenet? You'll be wanting single unequivocal answers next!

Seriously though, you had been asked several times for the traceback,
so that we could stop guessing and tell you for sure what was going
on, and you hadn't provided it. Diez's mild sarcasm was not uncalled-
for. The fact that you didn't have a traceback partially excuses you,
but it would have helped if you'd said so.

You're catching the IOError, presumably so that you can fail
gracefully elsewhere. This may not be a particularly good
idea, and in any case it stops the exception reaching the
console where it would cause the traceback to be displayed.
More on this later.

As other people have pointed out, you've got a typo here.

[Huge amounts of text trimmed]

Fair enough, you're catching the IOError so that you can
ensure that DataFH is closed. Unfortunately this concealed
the traceback information, which would have made it more
obvious to you what people were talking about. Given that
this has rather stuffed your C8DataType instance, you
might want to think about re-raising the exception after
you've closed DataFH and letting the outer layers deal
with it in a more appropriate fashion.

Incidentally, this code isn't going to do anything useful
for you anyway even after you've fixed the typo. DataFH
and ResourceFH are both local variables to __init__ and
will be tossed away when it finishes executing. If you
want to use them later, make them self.data_fh and
self.resource_fh respectively.

(PEP 8 recommends that you use lower_case_with_underscores
for variable or attribute names, and leave MixedCase for
class names.)
 
L

Lionel

[Quoting restored for reduced


On Usenet?  You'll be wanting single unequivocal answers next!

Seriously though, you had been asked several times for the traceback,
so that we could stop guessing and tell you for sure what was going
on, and you hadn't provided it.  Diez's mild sarcasm was not uncalled-
for.  The fact that you didn't have a traceback partially excuses you,
but it would have helped if you'd said so.







You're catching the IOError, presumably so that you can fail
gracefully elsewhere.  This may not be a particularly good
idea, and in any case it stops the exception reaching the
console where it would cause the traceback to be displayed.
More on this later.

As other people have pointed out, you've got a typo here.

[Huge amounts of text trimmed]

Fair enough, you're catching the IOError so that you can
ensure that DataFH is closed.  Unfortunately this concealed
the traceback information, which would have made it more
obvious to you what people were talking about.  Given that
this has rather stuffed your C8DataType instance, you
might want to think about re-raising the exception after
you've closed DataFH and letting the outer layers deal
with it in a more appropriate fashion.

Incidentally, this code isn't going to do anything useful
for you anyway even after you've fixed the typo.  DataFH
and ResourceFH are both local variables to __init__ and
will be tossed away when it finishes executing.  If you
want to use them later, make them self.data_fh and
self.resource_fh respectively.

(PEP 8 recommends that you use lower_case_with_underscores
for variable or attribute names, and leave MixedCase for
class names.)

Very good comments. I'll be implementing some of your suggestions, to
be sure. Thanks Rhodri.
 

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,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top