Skip to content

Commit b9d48e4

Browse files
cbertinatojreback
authored andcommittedAug 30, 2017
CLN: replace %s syntax with .format in io/formats/format.py (#17358)
Progress toward issue #16130. Converted old string formatting to new string formatting in io/formats/format.py.
1 parent 0d676a3 commit b9d48e4

File tree

1 file changed

+93
-72
lines changed

1 file changed

+93
-72
lines changed
 

‎pandas/io/formats/format.py

Lines changed: 93 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747

4848
import itertools
4949
import csv
50+
from functools import partial
5051

5152
common_docstring = """
5253
Parameters
@@ -109,7 +110,7 @@ def _get_footer(self):
109110
if self.length:
110111
if footer:
111112
footer += ', '
112-
footer += "Length: %d" % len(self.categorical)
113+
footer += "Length: {length}".format(length=len(self.categorical))
113114

114115
level_info = self.categorical._repr_categories_info()
115116

@@ -135,7 +136,7 @@ def to_string(self):
135136

136137
fmt_values = self._get_formatted_values()
137138

138-
result = ['%s' % i for i in fmt_values]
139+
result = [u('{i}').format(i=i) for i in fmt_values]
139140
result = [i.strip() for i in result]
140141
result = u(', ').join(result)
141142
result = [u('[') + result + u(']')]
@@ -191,28 +192,29 @@ def _get_footer(self):
191192
footer = u('')
192193

193194
if getattr(self.series.index, 'freq', None) is not None:
194-
footer += 'Freq: %s' % self.series.index.freqstr
195+
footer += 'Freq: {freq}'.format(freq=self.series.index.freqstr)
195196

196197
if self.name is not False and name is not None:
197198
if footer:
198199
footer += ', '
199200

200201
series_name = pprint_thing(name,
201202
escape_chars=('\t', '\r', '\n'))
202-
footer += ("Name: %s" % series_name) if name is not None else ""
203+
footer += ((u"Name: {sname}".format(sname=series_name))
204+
if name is not None else "")
203205

204206
if (self.length is True or
205207
(self.length == 'truncate' and self.truncate_v)):
206208
if footer:
207209
footer += ', '
208-
footer += 'Length: %d' % len(self.series)
210+
footer += 'Length: {length}'.format(length=len(self.series))
209211

210212
if self.dtype is not False and self.dtype is not None:
211213
name = getattr(self.tr_series.dtype, 'name', None)
212214
if name:
213215
if footer:
214216
footer += ', '
215-
footer += 'dtype: %s' % pprint_thing(name)
217+
footer += u'dtype: {typ}'.format(typ=pprint_thing(name))
216218

217219
# level infos are added to the end and in a new line, like it is done
218220
# for Categoricals
@@ -509,8 +511,10 @@ def _to_str_columns(self):
509511
else:
510512
if is_list_like(self.header):
511513
if len(self.header) != len(self.columns):
512-
raise ValueError(('Writing %d cols but got %d aliases'
513-
% (len(self.columns), len(self.header))))
514+
raise ValueError(('Writing {ncols} cols but got {nalias} '
515+
'aliases'
516+
.format(ncols=len(self.columns),
517+
nalias=len(self.header))))
514518
str_columns = [[label] for label in self.header]
515519
else:
516520
str_columns = self._get_formatted_column_labels(frame)
@@ -578,10 +582,10 @@ def to_string(self):
578582
frame = self.frame
579583

580584
if len(frame.columns) == 0 or len(frame.index) == 0:
581-
info_line = (u('Empty %s\nColumns: %s\nIndex: %s') %
582-
(type(self.frame).__name__,
583-
pprint_thing(frame.columns),
584-
pprint_thing(frame.index)))
585+
info_line = (u('Empty {name}\nColumns: {col}\nIndex: {idx}')
586+
.format(name=type(self.frame).__name__,
587+
col=pprint_thing(frame.columns),
588+
idx=pprint_thing(frame.index)))
585589
text = info_line
586590
else:
587591

@@ -630,8 +634,8 @@ def to_string(self):
630634
self.buf.writelines(text)
631635

632636
if self.should_show_dimensions:
633-
self.buf.write("\n\n[%d rows x %d columns]" %
634-
(len(frame), len(frame.columns)))
637+
self.buf.write("\n\n[{nrows} rows x {ncols} columns]"
638+
.format(nrows=len(frame), ncols=len(frame.columns)))
635639

636640
def _join_multiline(self, *strcols):
637641
lwidth = self.line_width
@@ -805,7 +809,8 @@ def _get_formatted_index(self, frame):
805809

806810
# empty space for columns
807811
if show_col_names:
808-
col_header = ['%s' % x for x in self._get_column_name_list()]
812+
col_header = ['{x}'.format(x=x)
813+
for x in self._get_column_name_list()]
809814
else:
810815
col_header = [''] * columns.nlevels
811816

@@ -861,9 +866,10 @@ def write_result(self, buf):
861866

862867
# string representation of the columns
863868
if len(self.frame.columns) == 0 or len(self.frame.index) == 0:
864-
info_line = (u('Empty %s\nColumns: %s\nIndex: %s') %
865-
(type(self.frame).__name__, self.frame.columns,
866-
self.frame.index))
869+
info_line = (u('Empty {name}\nColumns: {col}\nIndex: {idx}')
870+
.format(name=type(self.frame).__name__,
871+
col=self.frame.columns,
872+
idx=self.frame.index))
867873
strcols = [[info_line]]
868874
else:
869875
strcols = self.fmt._to_str_columns()
@@ -906,14 +912,16 @@ def get_col_type(dtype):
906912
column_format = index_format + column_format
907913
elif not isinstance(column_format,
908914
compat.string_types): # pragma: no cover
909-
raise AssertionError('column_format must be str or unicode, not %s'
910-
% type(column_format))
915+
raise AssertionError('column_format must be str or unicode, '
916+
'not {typ}'.format(typ=type(column_format)))
911917

912918
if not self.longtable:
913-
buf.write('\\begin{tabular}{%s}\n' % column_format)
919+
buf.write('\\begin{{tabular}}{{{fmt}}}\n'
920+
.format(fmt=column_format))
914921
buf.write('\\toprule\n')
915922
else:
916-
buf.write('\\begin{longtable}{%s}\n' % column_format)
923+
buf.write('\\begin{{longtable}}{{{fmt}}}\n'
924+
.format(fmt=column_format))
917925
buf.write('\\toprule\n')
918926

919927
ilevels = self.frame.index.nlevels
@@ -948,7 +956,7 @@ def get_col_type(dtype):
948956
crow = [x if x else '{}' for x in row]
949957
if self.bold_rows and self.fmt.index:
950958
# bold row labels
951-
crow = ['\\textbf{%s}' % x
959+
crow = ['\\textbf{{{x}}}'.format(x=x)
952960
if j < ilevels and x.strip() not in ['', '{}'] else x
953961
for j, x in enumerate(crow)]
954962
if i < clevels and self.fmt.header and self.multicolumn:
@@ -986,9 +994,9 @@ def _format_multicolumn(self, row, ilevels):
986994
def append_col():
987995
# write multicolumn if needed
988996
if ncol > 1:
989-
row2.append('\\multicolumn{{{0:d}}}{{{1:s}}}{{{2:s}}}'
990-
.format(ncol, self.multicolumn_format,
991-
coltext.strip()))
997+
row2.append('\\multicolumn{{{ncol:d}}}{{{fmt:s}}}{{{txt:s}}}'
998+
.format(ncol=ncol, fmt=self.multicolumn_format,
999+
txt=coltext.strip()))
9921000
# don't modify where not needed
9931001
else:
9941002
row2.append(coltext)
@@ -1027,8 +1035,8 @@ def _format_multirow(self, row, ilevels, i, rows):
10271035
break
10281036
if nrow > 1:
10291037
# overwrite non-multirow entry
1030-
row[j] = '\\multirow{{{0:d}}}{{*}}{{{1:s}}}'.format(
1031-
nrow, row[j].strip())
1038+
row[j] = '\\multirow{{{nrow:d}}}{{*}}{{{row:s}}}'.format(
1039+
nrow=nrow, row=row[j].strip())
10321040
# save when to end the current block with \cline
10331041
self.clinebuf.append([i + nrow - 1, j + 1])
10341042
return row
@@ -1039,7 +1047,8 @@ def _print_cline(self, buf, i, icol):
10391047
"""
10401048
for cl in self.clinebuf:
10411049
if cl[0] == i:
1042-
buf.write('\cline{{{0:d}-{1:d}}}\n'.format(cl[1], icol))
1050+
buf.write('\cline{{{cl:d}-{icol:d}}}\n'
1051+
.format(cl=cl[1], icol=icol))
10431052
# remove entries that have been written to buffer
10441053
self.clinebuf = [x for x in self.clinebuf if x[0] != i]
10451054

@@ -1076,7 +1085,8 @@ def write(self, s, indent=0):
10761085
def write_th(self, s, indent=0, tags=None):
10771086
if self.fmt.col_space is not None and self.fmt.col_space > 0:
10781087
tags = (tags or "")
1079-
tags += 'style="min-width: %s;"' % self.fmt.col_space
1088+
tags += ('style="min-width: {colspace};"'
1089+
.format(colspace=self.fmt.col_space))
10801090

10811091
return self._write_cell(s, kind='th', indent=indent, tags=tags)
10821092

@@ -1085,9 +1095,9 @@ def write_td(self, s, indent=0, tags=None):
10851095

10861096
def _write_cell(self, s, kind='td', indent=0, tags=None):
10871097
if tags is not None:
1088-
start_tag = '<%s %s>' % (kind, tags)
1098+
start_tag = '<{kind} {tags}>'.format(kind=kind, tags=tags)
10891099
else:
1090-
start_tag = '<%s>' % kind
1100+
start_tag = '<{kind}>'.format(kind=kind)
10911101

10921102
if self.escape:
10931103
# escape & first to prevent double escaping of &
@@ -1096,7 +1106,8 @@ def _write_cell(self, s, kind='td', indent=0, tags=None):
10961106
else:
10971107
esc = {}
10981108
rs = pprint_thing(s, escape_chars=esc).strip()
1099-
self.write('%s%s</%s>' % (start_tag, rs, kind), indent)
1109+
self.write(u'{start}{rs}</{kind}>'
1110+
.format(start=start_tag, rs=rs, kind=kind), indent)
11001111

11011112
def write_tr(self, line, indent=0, indent_delta=4, header=False,
11021113
align=None, tags=None, nindex_levels=0):
@@ -1106,7 +1117,8 @@ def write_tr(self, line, indent=0, indent_delta=4, header=False,
11061117
if align is None:
11071118
self.write('<tr>', indent)
11081119
else:
1109-
self.write('<tr style="text-align: %s;">' % align, indent)
1120+
self.write('<tr style="text-align: {align};">'
1121+
.format(align=align), indent)
11101122
indent += indent_delta
11111123

11121124
for i, s in enumerate(line):
@@ -1146,8 +1158,8 @@ def write_result(self, buf):
11461158
if isinstance(self.classes, str):
11471159
self.classes = self.classes.split()
11481160
if not isinstance(self.classes, (list, tuple)):
1149-
raise AssertionError('classes must be list or tuple, '
1150-
'not %s' % type(self.classes))
1161+
raise AssertionError('classes must be list or tuple, not {typ}'
1162+
.format(typ=type(self.classes)))
11511163
_classes.extend(self.classes)
11521164

11531165
if self.notebook:
@@ -1159,12 +1171,11 @@ def write_result(self, buf):
11591171
except (ImportError, AttributeError):
11601172
pass
11611173

1162-
self.write('<div{0}>'.format(div_style))
1174+
self.write('<div{style}>'.format(style=div_style))
11631175

11641176
self.write_style()
1165-
self.write('<table border="%s" class="%s">' % (self.border,
1166-
' '.join(_classes)),
1167-
indent)
1177+
self.write('<table border="{border}" class="{cls}">'
1178+
.format(border=self.border, cls=' '.join(_classes)), indent)
11681179

11691180
indent += self.indent_delta
11701181
indent = self._write_header(indent)
@@ -1173,8 +1184,10 @@ def write_result(self, buf):
11731184
self.write('</table>', indent)
11741185
if self.should_show_dimensions:
11751186
by = chr(215) if compat.PY3 else unichr(215) # ×
1176-
self.write(u('<p>%d rows %s %d columns</p>') %
1177-
(len(frame), by, len(frame.columns)))
1187+
self.write(u('<p>{rows} rows {by} {cols} columns</p>')
1188+
.format(rows=len(frame),
1189+
by=by,
1190+
cols=len(frame.columns)))
11781191

11791192
if self.notebook:
11801193
self.write('</div>')
@@ -1199,7 +1212,7 @@ def _column_header():
11991212
row.append(single_column_table(self.columns.names))
12001213
else:
12011214
row.append('')
1202-
style = "text-align: %s;" % self.fmt.justify
1215+
style = "text-align: {just};".format(just=self.fmt.justify)
12031216
row.extend([single_column_table(c, self.fmt.justify, style)
12041217
for c in self.columns])
12051218
else:
@@ -1214,7 +1227,7 @@ def _column_header():
12141227
indent += self.indent_delta
12151228

12161229
if isinstance(self.columns, MultiIndex):
1217-
template = 'colspan="%d" halign="left"'
1230+
template = 'colspan="{span:d}" halign="left"'
12181231

12191232
if self.fmt.sparsify:
12201233
# GH3547
@@ -1282,7 +1295,7 @@ def _column_header():
12821295
for i, v in enumerate(values):
12831296
if i in records:
12841297
if records[i] > 1:
1285-
tags[j] = template % records[i]
1298+
tags[j] = template.format(span=records[i])
12861299
else:
12871300
continue
12881301
j += 1
@@ -1372,7 +1385,7 @@ def _write_regular_rows(self, fmt_values, indent):
13721385
nindex_levels=1)
13731386

13741387
def _write_hierarchical_rows(self, fmt_values, indent):
1375-
template = 'rowspan="%d" valign="top"'
1388+
template = 'rowspan="{span}" valign="top"'
13761389

13771390
truncate_h = self.fmt.truncate_h
13781391
truncate_v = self.fmt.truncate_v
@@ -1447,7 +1460,7 @@ def _write_hierarchical_rows(self, fmt_values, indent):
14471460
for records, v in zip(level_lengths, idx_values[i]):
14481461
if i in records:
14491462
if records[i] > 1:
1450-
tags[j] = template % records[i]
1463+
tags[j] = template.format(span=records[i])
14511464
else:
14521465
sparse_offset += 1
14531466
continue
@@ -1615,8 +1628,9 @@ def _save_header(self):
16151628
return
16161629
if has_aliases:
16171630
if len(header) != len(cols):
1618-
raise ValueError(('Writing %d cols but got %d aliases'
1619-
% (len(cols), len(header))))
1631+
raise ValueError(('Writing {ncols} cols but got {nalias} '
1632+
'aliases'.format(ncols=len(cols),
1633+
nalias=len(header))))
16201634
else:
16211635
write_cols = header
16221636
else:
@@ -1790,8 +1804,9 @@ def _format_strings(self):
17901804
if self.float_format is None:
17911805
float_format = get_option("display.float_format")
17921806
if float_format is None:
1793-
fmt_str = '%% .%dg' % get_option("display.precision")
1794-
float_format = lambda x: fmt_str % x
1807+
fmt_str = ('{{x: .{prec:d}g}}'
1808+
.format(prec=get_option("display.precision")))
1809+
float_format = lambda x: fmt_str.format(x=x)
17951810
else:
17961811
float_format = self.float_format
17971812

@@ -1807,10 +1822,10 @@ def _format(x):
18071822
return 'NaT'
18081823
return self.na_rep
18091824
elif isinstance(x, PandasObject):
1810-
return '%s' % x
1825+
return u'{x}'.format(x=x)
18111826
else:
18121827
# object dtype
1813-
return '%s' % formatter(x)
1828+
return u'{x}'.format(x=formatter(x))
18141829

18151830
vals = self.values
18161831
if isinstance(vals, Index):
@@ -1824,11 +1839,11 @@ def _format(x):
18241839
fmt_values = []
18251840
for i, v in enumerate(vals):
18261841
if not is_float_type[i] and leading_space:
1827-
fmt_values.append(' %s' % _format(v))
1842+
fmt_values.append(u' {v}'.format(v=_format(v)))
18281843
elif is_float_type[i]:
18291844
fmt_values.append(float_format(v))
18301845
else:
1831-
fmt_values.append(' %s' % _format(v))
1846+
fmt_values.append(u' {v}'.format(v=_format(v)))
18321847

18331848
return fmt_values
18341849

@@ -1864,7 +1879,7 @@ def _value_formatter(self, float_format=None, threshold=None):
18641879
# because str(0.0) = '0.0' while '%g' % 0.0 = '0'
18651880
if float_format:
18661881
def base_formatter(v):
1867-
return (float_format % v) if notna(v) else self.na_rep
1882+
return float_format(value=v) if notna(v) else self.na_rep
18681883
else:
18691884
def base_formatter(v):
18701885
return str(v) if notna(v) else self.na_rep
@@ -1925,10 +1940,14 @@ def format_values_with(float_format):
19251940

19261941
# There is a special default string when we are fixed-width
19271942
# The default is otherwise to use str instead of a formatting string
1928-
if self.float_format is None and self.fixed_width:
1929-
float_format = '%% .%df' % self.digits
1943+
if self.float_format is None:
1944+
if self.fixed_width:
1945+
float_format = partial('{value: .{digits:d}f}'.format,
1946+
digits=self.digits)
1947+
else:
1948+
float_format = self.float_format
19301949
else:
1931-
float_format = self.float_format
1950+
float_format = lambda value: self.float_format % value
19321951

19331952
formatted_values = format_values_with(float_format)
19341953

@@ -1955,7 +1974,8 @@ def format_values_with(float_format):
19551974
(abs_vals > 0)).any()
19561975

19571976
if has_small_values or (too_long and has_large_values):
1958-
float_format = '%% .%de' % self.digits
1977+
float_format = partial('{value: .{digits:d}e}'.format,
1978+
digits=self.digits)
19591979
formatted_values = format_values_with(float_format)
19601980

19611981
return formatted_values
@@ -1971,7 +1991,7 @@ def _format_strings(self):
19711991
class IntArrayFormatter(GenericArrayFormatter):
19721992

19731993
def _format_strings(self):
1974-
formatter = self.formatter or (lambda x: '% d' % x)
1994+
formatter = self.formatter or (lambda x: '{x: d}'.format(x=x))
19751995
fmt_values = [formatter(x) for x in self.values]
19761996
return fmt_values
19771997

@@ -2023,7 +2043,7 @@ def _format_strings(self):
20232043
# periods may contains different freq
20242044
values = Index(self.values, dtype='object').to_native_types()
20252045

2026-
formatter = self.formatter or (lambda x: '%s' % x)
2046+
formatter = self.formatter or (lambda x: '{x}'.format(x=x))
20272047
fmt_values = [formatter(x) for x in values]
20282048
return fmt_values
20292049

@@ -2223,7 +2243,7 @@ def _formatter(x):
22232243
x = Timedelta(x)
22242244
result = x._repr_base(format=format)
22252245
if box:
2226-
result = "'{0}'".format(result)
2246+
result = "'{res}'".format(res=result)
22272247
return result
22282248

22292249
return _formatter
@@ -2278,20 +2298,20 @@ def _cond(values):
22782298
def single_column_table(column, align=None, style=None):
22792299
table = '<table'
22802300
if align is not None:
2281-
table += (' align="%s"' % align)
2301+
table += (' align="{align}"'.format(align=align))
22822302
if style is not None:
2283-
table += (' style="%s"' % style)
2303+
table += (' style="{style}"'.format(style=style))
22842304
table += '><tbody>'
22852305
for i in column:
2286-
table += ('<tr><td>%s</td></tr>' % str(i))
2306+
table += ('<tr><td>{i!s}</td></tr>'.format(i=i))
22872307
table += '</tbody></table>'
22882308
return table
22892309

22902310

22912311
def single_row_table(row): # pragma: no cover
22922312
table = '<table><tbody><tr>'
22932313
for i in row:
2294-
table += ('<td>%s</td>' % str(i))
2314+
table += ('<td>{i!s}</td>'.format(i=i))
22952315
table += '</tr></tbody></table>'
22962316
return table
22972317

@@ -2385,18 +2405,19 @@ def __call__(self, num):
23852405
prefix = self.ENG_PREFIXES[int_pow10]
23862406
else:
23872407
if int_pow10 < 0:
2388-
prefix = 'E-%02d' % (-int_pow10)
2408+
prefix = 'E-{pow10:02d}'.format(pow10=-int_pow10)
23892409
else:
2390-
prefix = 'E+%02d' % int_pow10
2410+
prefix = 'E+{pow10:02d}'.format(pow10=int_pow10)
23912411

23922412
mant = sign * dnum / (10**pow10)
23932413

23942414
if self.accuracy is None: # pragma: no cover
2395-
format_str = u("% g%s")
2415+
format_str = u("{mant: g}{prefix}")
23962416
else:
2397-
format_str = (u("%% .%if%%s") % self.accuracy)
2417+
format_str = (u("{{mant: .{acc:d}f}}{{prefix}}")
2418+
.format(acc=self.accuracy))
23982419

2399-
formatted = format_str % (mant, prefix)
2420+
formatted = format_str.format(mant=mant, prefix=prefix)
24002421

24012422
return formatted # .strip()
24022423

0 commit comments

Comments
 (0)
Please sign in to comment.