131

The hex() function in python, puts the leading characters 0x in front of the number. Is there anyway to tell it NOT to put them? So 0xfa230 will be fa230.

The code is

import fileinput
f = open('hexa', 'w')
for line in fileinput.input(['pattern0.txt']):
   f.write(hex(int(line)))
   f.write('\n')
mahmood
  • 21,089
  • 43
  • 130
  • 209

9 Answers9

238

(Recommended)

Python 3 f-strings: Answered by @GringoSuave

>>> i = 3735928559
>>> f'{i:x}'
'deadbeef'

Alternatives:

format builtin function (good for single values only)

>>> format(3735928559, 'x')
'deadbeef'

And sometimes we still may need to use str.format formatting in certain situations @Eumiro

(Though I would still recommend f-strings in most situations)

>>> '{:x}'.format(3735928559)
'deadbeef'

(Legacy) f-strings should solve all of your needs, but printf-style formatting is what we used to do @msvalkon

>>> '%x' % 3735928559
'deadbeef'

Hacky Answers (avoid)

hex(i)[2:] @GuillaumeLemaître

>>> i = 3735928559
>>> hex(i)[2:]
'deadbeef'

This relies on string slicing instead of using a function / method made specifically for formatting as hex. This is why it may give unexpected output for negative numbers:

>>> i = -3735928559
>>> hex(i)[2:]
'xdeadbeef'
>>> f'{i:x}'
'-deadbeef'
jamylak
  • 120,885
  • 29
  • 225
  • 225
67

Use this code:

'{:x}'.format(int(line))

it allows you to specify a number of digits too:

'{:06x}'.format(123)
# '00007b'

For Python 2.6 use

'{0:x}'.format(int(line))

or

'{0:06x}'.format(int(line))
eumiro
  • 194,053
  • 32
  • 286
  • 259
  • 11
    Using the `format()` function is easier, you are not using any templating functionality, only formatting. If all your template contains is `{:..}` for *one* value, move to `format(value, '..')` instead. – Martijn Pieters May 07 '13 at 08:33
26

You can simply write

hex(x)[2:]

to get the first two characters removed.

Guillaume Lemaître
  • 1,182
  • 10
  • 18
20

Python 3.6+:

>>> i = 240
>>> f'{i:x}'
'f0'
wjandrea
  • 23,210
  • 7
  • 49
  • 68
Gringo Suave
  • 27,899
  • 6
  • 81
  • 73
8

Old style string formatting:

In [3]: "%x" % 127
Out[3]: '7f'

New style

In [7]: '{:x}'.format(127)
Out[7]: '7f'

Using capital letters as format characters yields uppercase hexadecimal

In [8]: '{:X}'.format(127)
Out[8]: '7F'

Docs are here.

wjandrea
  • 23,210
  • 7
  • 49
  • 68
msvalkon
  • 11,417
  • 2
  • 39
  • 37
6

F-strings

Python 3's formatted literal strings (f-strings) support the Format Specification Mini-Language, which designates x for hexadecimal numbers. The output doesn't include 0x.

So you can do this:

>>> f"{3735928559:x}"
'deadbeef'

See the spec for other bases like binary, octal, etc.

Edit: str.removeprefix

Since Python 3.9, there is now a str.removeprefix method, which allows you to write the following more obvious code:

>>> hexadecimal = hex(3735928559)
>>> hexadecimal.removeprefix('0x')
'deadbeef'

Not that this does NOT work for negative numbers ❌:

>>> negadecimal = hex(-3735928559)
>>> negadecimal.removeprefix('0x')
'-0xdeadbeef'
Amin Shah Gilani
  • 7,079
  • 3
  • 29
  • 65
5

'x' - Outputs the number in base 16, using lower-case letters for the digits above 9.

>>> format(3735928559, 'x')
'deadbeef'

'X' - Outputs the number in base 16, using upper-case letters for the digits above 9.

>>> format(3735928559, 'X')
'DEADBEEF'

You can find more information about that in Python's documentation:

-1

While all of the previous answers will work, a lot of them have caveats like not being able to handle both positive and negative numbers or only work in Python 2 or 3. The version below works in both Python 2 and 3 and for positive and negative numbers:

Since Python returns a string hexadecimal value from hex() we can use string.replace to remove the 0x characters regardless of their position in the string (which is important since this differs for positive and negative numbers).

hexValue = hexValue.replace('0x','')

EDIT: wjandrea made a good point in that the above implementation doesn't handle values that contain 0X instead of 0x, which can occur in int literals. With this use case in mind, you can use the following case-insensitive implementation for Python 2 and 3:

import re
hexValue = re.sub('0x', '', hexValue, flags=re.IGNORECASE)
  • This works, but why remove `'0x'` when you could avoid adding it in the first place with the format spec `x`? [jamylak's answer](/a/16414603/4518341) and [Gringo Suave's answer](/a/52674814/4518341) cover it. – wjandrea Dec 21 '21 at 23:25
  • 1
    @wjandrea I'm not sure why I thought jamylak's answer didn't work on both Python 2 and 3. I just tested it on Python 2.7.2 and 3.7.8 and it worked on both of these. Also, thank you for pointing out the edge case that my original answer wasn't addressing. I've provided an updated implementation that addresses this use case as well. – Austin Patton Dec 24 '21 at 20:32
-3

Decimal to Hexadecimal, it worked

hex(number).lstrip("0x").rstrip("L")
Baxromov
  • 25
  • 5