Hexadecimal list conversion

N

Neil Webster

Hi All.

I have a list which is a line from a file:
['\x003\x008\x001\x004\x007\x005\x00.\x005\x000\x002\x005\x009\x009\x00',
'\x002\x001\x003\x006\x002\x002\x00.\x001\x007\x004\x002\x008\x002\x00']

This should be in the format:
['381475.502599', '213622.174282']

I've tried a few options using replace (replacing "\x00" with "") and
trying to convert from hexademical to decimal.

But nothing has worked. Can anybody give any tips to help?

Thanks.
 
P

Paul Hankin

Hi All.

I have a list which is a line from a file:
['\x003\x008\x001\x004\x007\x005\x00.\x005\x000\x002\x005\x009\x009\x00',
'\x002\x001\x003\x006\x002\x002\x00.\x001\x007\x004\x002\x008\x002\x00']

This should be in the format:
['381475.502599', '213622.174282']

I've tried a few options using replace (replacing "\x00" with "") and
trying to convert from hexademical to decimal.

But nothing has worked. Can anybody give any tips to help?

Is your file utf-16 (that would explain why your file has \x00 in
between every character)? If so, use codecs.open to read it, and you
won't get the \x00's (you'll get a unicode string).

Or you can remove them using replace:

a = a.replace('\x00', '')

HTH
 
A

Andreas Tawn

Hi All.
I have a list which is a line from a file:
['\x003\x008\x001\x004\x007\x005\x00.\x005\x000\x002\x005\x009
\x009\x00',
'\x002\x001\x003\x006\x002\x002\x00.\x001\x007\x004\x002\x008\
x002\x00']

This should be in the format:
['381475.502599', '213622.174282']

I've tried a few options using replace (replacing "\x00" with "") and
trying to convert from hexademical to decimal.

But nothing has worked. Can anybody give any tips to help?

Thanks.

Somthing like:

line =
['\x003\x008\x001\x004\x007\x005\x00.\x005\x000\x002\x005\x009\x009\x00'
,
'\x002\x001\x003\x006\x002\x002\x00.\x001\x007\x004\x002\x008\x002\x00']

result = [''.join(x.split('\x00')) for x in line]

Cheers,

Drea
 
G

Gabriel Genellina

I have a list which is a line from a file:
['\x003\x008\x001\x004\x007\x005\x00.\x005\x000\x002\x005\x009\x009\x00',
'\x002\x001\x003\x006\x002\x002\x00.\x001\x007\x004\x002\x008\x002\x00']

This should be in the format:
['381475.502599', '213622.174282']

I've tried a few options using replace (replacing "\x00" with "") and
trying to convert from hexademical to decimal.

The replace works:

py> for item in L:
.... print item.replace('\x00','')
....
381475.502599
213622.174282

If you got that from a file, I bet you read it using the wrong encoding.
Try opening the file using codecs.open("filename", "rb",
encoding="utf-16-be") instead of plain open. When your read it, you'll get
unicode objects instead of strings, but with the right contents. If you
wish you can convert to strings using
line_read.encode(your_system_encoding); if all your data is numeric the
encoding used is irrelevant and can be omited.
 
M

Mark T

Gabriel Genellina said:
I have a list which is a line from a file:
['\x003\x008\x001\x004\x007\x005\x00.\x005\x000\x002\x005\x009\x009\x00',
'\x002\x001\x003\x006\x002\x002\x00.\x001\x007\x004\x002\x008\x002\x00']

This should be in the format:
['381475.502599', '213622.174282']

I've tried a few options using replace (replacing "\x00" with "") and
trying to convert from hexademical to decimal.

The replace works:

py> for item in L:
... print item.replace('\x00','')
...
381475.502599
213622.174282

If you got that from a file, I bet you read it using the wrong encoding.
Try opening the file using codecs.open("filename", "rb",
encoding="utf-16-be") instead of plain open. When your read it, you'll get
unicode objects instead of strings, but with the right contents. If you
wish you can convert to strings using
line_read.encode(your_system_encoding); if all your data is numeric the
encoding used is irrelevant and can be omited.

There is an odd number of bytes in each string. Each begins and ends with
\x00, so it doesn't look like utf-16-be. But replace works:
L=['\x003\x008\x001\x004\x007\x005\x00.\x005\x000\x002\x005\x009\x009\x00','\x002\x001\x003\x006\x002\x002\x00.\x001\x007\x004\x002\x008\x002\x00']
[s.replace('\x00','') for s in L]
['381475.502599', '213622.174282']

-Mark Tolonen
 
P

Peter Otten

There is an odd number of bytes in each string. Each begins and ends
with \x00, so it doesn't look like utf-16-be.

I think Gabriel is right. The OP probably butchered the original structure
with

open(filename).read().split("\n")

Peter
 
J

John Machin

I think Gabriel is right. The OP probably butchered the original structure
with

open(filename).read().split("\n")

Or he's read the file "normally" and then done
line = lineZAP
where ZAP is one of [:-1], .rstrip(), .rstrip("\n"), etc

However that accounts only for the rightmost trailing \x00. Looks like
each line has been chainsawed with .split(",") or whatever the
original field separator was.

If Gabriel's instructions don't "work" for the OP, the OP should show
us an unambiguous representation of the first few bytes of the
original file, instead of leaving it to guesswork:

print repr(open("the_file", "rb").read()[:200])
 
G

Gabriel Genellina

I think Gabriel is right. The OP probably butchered the original
structure
with

open(filename).read().split("\n")

Sure! I take bets on this too.
 

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,764
Messages
2,569,564
Members
45,039
Latest member
CasimiraVa

Latest Threads

Top