Skip to content

Commit 4c9e98d

Browse files
cbertinatojreback
authored andcommitted
CLN: replace %s syntax with .format in io (#17660)
Progress toward issue #16130. Converted old string formatting to new string formatting in io/html.py, io/excel.py, msgpack/_packer.pyx, msgpack/_unpacker.pyx, clipboard/exceptions.py, json/json.py, json/normalize.py, sas/sas.pyx
1 parent 42195db commit 4c9e98d

File tree

8 files changed

+101
-74
lines changed

8 files changed

+101
-74
lines changed

pandas/io/clipboard/exceptions.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ class PyperclipException(RuntimeError):
88
class PyperclipWindowsException(PyperclipException):
99

1010
def __init__(self, message):
11-
message += " (%s)" % ctypes.WinError()
11+
message += " ({err})".format(err=ctypes.WinError())
1212
super(PyperclipWindowsException, self).__init__(message)

pandas/io/excel.py

+43-29
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ def register_writer(klass):
165165
if ext.startswith('.'):
166166
ext = ext[1:]
167167
if ext not in _writer_extensions:
168-
config.register_option("io.excel.%s.writer" % ext,
168+
config.register_option("io.excel.{ext}.writer".format(ext=ext),
169169
engine_name, validator=str)
170170
_writer_extensions.append(ext)
171171

@@ -190,7 +190,8 @@ def get_writer(engine_name):
190190
try:
191191
return _writers[engine_name]
192192
except KeyError:
193-
raise ValueError("No Excel writer '%s'" % engine_name)
193+
raise ValueError("No Excel writer '{engine}'"
194+
.format(engine=engine_name))
194195

195196

196197
@Appender(_read_excel_doc)
@@ -259,7 +260,7 @@ def __init__(self, io, **kwds):
259260
engine = kwds.pop('engine', None)
260261

261262
if engine is not None and engine != 'xlrd':
262-
raise ValueError("Unknown engine: %s" % engine)
263+
raise ValueError("Unknown engine: {engine}".format(engine=engine))
263264

264265
# If io is a url, want to keep the data as bytes so can't pass
265266
# to get_filepath_or_buffer()
@@ -445,7 +446,7 @@ def _parse_cell(cell_contents, cell_typ):
445446

446447
for asheetname in sheets:
447448
if verbose:
448-
print("Reading sheet %s" % asheetname)
449+
print("Reading sheet {sheet}".format(sheet=asheetname))
449450

450451
if isinstance(asheetname, compat.string_types):
451452
sheet = self.book.sheet_by_name(asheetname)
@@ -634,7 +635,7 @@ def _conv_value(val):
634635
elif is_bool(val):
635636
val = bool(val)
636637
elif isinstance(val, Period):
637-
val = "%s" % val
638+
val = "{val}".format(val=val)
638639
elif is_list_like(val):
639640
val = str(val)
640641

@@ -697,9 +698,11 @@ def __new__(cls, path, engine=None, **kwargs):
697698
ext = 'xlsx'
698699

699700
try:
700-
engine = config.get_option('io.excel.%s.writer' % ext)
701+
engine = config.get_option('io.excel.{ext}.writer'
702+
.format(ext=ext))
701703
except KeyError:
702-
error = ValueError("No engine for filetype: '%s'" % ext)
704+
error = ValueError("No engine for filetype: '{ext}'"
705+
.format(ext=ext))
703706
raise error
704707
cls = get_writer(engine)
705708

@@ -787,8 +790,9 @@ def check_extension(cls, ext):
787790
if ext.startswith('.'):
788791
ext = ext[1:]
789792
if not any(ext in extension for extension in cls.supported_extensions):
790-
msg = (u("Invalid extension for engine '%s': '%s'") %
791-
(pprint_thing(cls.engine), pprint_thing(ext)))
793+
msg = (u("Invalid extension for engine '{engine}': '{ext}'")
794+
.format(engine=pprint_thing(cls.engine),
795+
ext=pprint_thing(ext)))
792796
raise ValueError(msg)
793797
else:
794798
return True
@@ -813,8 +817,8 @@ class _Openpyxl1Writer(ExcelWriter):
813817
def __init__(self, path, engine=None, **engine_kwargs):
814818
if not openpyxl_compat.is_compat(major_ver=self.openpyxl_majorver):
815819
raise ValueError('Installed openpyxl is not supported at this '
816-
'time. Use {0}.x.y.'
817-
.format(self.openpyxl_majorver))
820+
'time. Use {majorver}.x.y.'
821+
.format(majorver=self.openpyxl_majorver))
818822
# Use the openpyxl module as the Excel writer.
819823
from openpyxl.workbook import Workbook
820824

@@ -854,7 +858,8 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
854858

855859
for cell in cells:
856860
colletter = get_column_letter(startcol + cell.col + 1)
857-
xcell = wks.cell("%s%s" % (colletter, startrow + cell.row + 1))
861+
xcell = wks.cell("{col}{row}".format(col=colletter,
862+
row=startrow + cell.row + 1))
858863
if (isinstance(cell.val, compat.string_types) and
859864
xcell.data_type_for_value(cell.val) != xcell.TYPE_STRING):
860865
xcell.set_value_explicit(cell.val)
@@ -876,10 +881,12 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
876881
cletterstart = get_column_letter(startcol + cell.col + 1)
877882
cletterend = get_column_letter(startcol + cell.mergeend + 1)
878883

879-
wks.merge_cells('%s%s:%s%s' % (cletterstart,
880-
startrow + cell.row + 1,
881-
cletterend,
882-
startrow + cell.mergestart + 1))
884+
wks.merge_cells('{start}{row}:{end}{mergestart}'
885+
.format(start=cletterstart,
886+
row=startrow + cell.row + 1,
887+
end=cletterend,
888+
mergestart=startrow +
889+
cell.mergestart + 1))
883890

884891
# Excel requires that the format of the first cell in a merged
885892
# range is repeated in the rest of the merged range.
@@ -895,7 +902,8 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
895902
# Ignore first cell. It is already handled.
896903
continue
897904
colletter = get_column_letter(col)
898-
xcell = wks.cell("%s%s" % (colletter, row))
905+
xcell = wks.cell("{col}{row}"
906+
.format(col=colletter, row=row))
899907
for field in style.__fields__:
900908
xcell.style.__setattr__(
901909
field, style.__getattribute__(field))
@@ -955,7 +963,8 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
955963

956964
for cell in cells:
957965
colletter = get_column_letter(startcol + cell.col + 1)
958-
xcell = wks["%s%s" % (colletter, startrow + cell.row + 1)]
966+
xcell = wks["{col}{row}"
967+
.format(col=colletter, row=startrow + cell.row + 1)]
959968
xcell.value = _conv_value(cell.val)
960969
style_kwargs = {}
961970

@@ -977,10 +986,12 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
977986
cletterstart = get_column_letter(startcol + cell.col + 1)
978987
cletterend = get_column_letter(startcol + cell.mergeend + 1)
979988

980-
wks.merge_cells('%s%s:%s%s' % (cletterstart,
981-
startrow + cell.row + 1,
982-
cletterend,
983-
startrow + cell.mergestart + 1))
989+
wks.merge_cells('{start}{row}:{end}{mergestart}'
990+
.format(start=cletterstart,
991+
row=startrow + cell.row + 1,
992+
end=cletterend,
993+
mergestart=startrow +
994+
cell.mergestart + 1))
984995

985996
# Excel requires that the format of the first cell in a merged
986997
# range is repeated in the rest of the merged range.
@@ -996,7 +1007,8 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0,
9961007
# Ignore first cell. It is already handled.
9971008
continue
9981009
colletter = get_column_letter(col)
999-
xcell = wks["%s%s" % (colletter, row)]
1010+
xcell = wks["{col}{row}"
1011+
.format(col=colletter, row=row)]
10001012
xcell.style = xcell.style.copy(**style_kwargs)
10011013

10021014
@classmethod
@@ -1030,7 +1042,7 @@ def _convert_to_style_kwargs(cls, style_dict):
10301042
for k, v in style_dict.items():
10311043
if k in _style_key_map:
10321044
k = _style_key_map[k]
1033-
_conv_to_x = getattr(cls, '_convert_to_{0}'.format(k),
1045+
_conv_to_x = getattr(cls, '_convert_to_{k}'.format(k=k),
10341046
lambda x: None)
10351047
new_v = _conv_to_x(v)
10361048
if new_v:
@@ -1505,17 +1517,19 @@ def _style_to_xlwt(cls, item, firstlevel=True, field_sep=',',
15051517
"""
15061518
if hasattr(item, 'items'):
15071519
if firstlevel:
1508-
it = ["%s: %s" % (key, cls._style_to_xlwt(value, False))
1520+
it = ["{key}: {val}"
1521+
.format(key=key, val=cls._style_to_xlwt(value, False))
15091522
for key, value in item.items()]
1510-
out = "%s " % (line_sep).join(it)
1523+
out = "{sep} ".format(sep=(line_sep).join(it))
15111524
return out
15121525
else:
1513-
it = ["%s %s" % (key, cls._style_to_xlwt(value, False))
1526+
it = ["{key} {val}"
1527+
.format(key=key, val=cls._style_to_xlwt(value, False))
15141528
for key, value in item.items()]
1515-
out = "%s " % (field_sep).join(it)
1529+
out = "{sep} ".format(sep=(field_sep).join(it))
15161530
return out
15171531
else:
1518-
item = "%s" % item
1532+
item = "{item}".format(item=item)
15191533
item = item.replace("True", "on")
15201534
item = item.replace("False", "off")
15211535
return item

pandas/io/html.py

+26-20
Original file line numberDiff line numberDiff line change
@@ -439,14 +439,15 @@ def _parse_tables(self, doc, match, attrs):
439439
unique_tables.add(table)
440440

441441
if not result:
442-
raise ValueError("No tables found matching pattern %r" %
443-
match.pattern)
442+
raise ValueError("No tables found matching pattern {patt!r}"
443+
.format(patt=match.pattern))
444444
return result
445445

446446
def _setup_build_doc(self):
447447
raw_text = _read(self.io)
448448
if not raw_text:
449-
raise ValueError('No text parsed from document: %s' % self.io)
449+
raise ValueError('No text parsed from document: {doc}'
450+
.format(doc=self.io))
450451
return raw_text
451452

452453
def _build_doc(self):
@@ -473,8 +474,8 @@ def _build_xpath_expr(attrs):
473474
if 'class_' in attrs:
474475
attrs['class'] = attrs.pop('class_')
475476

476-
s = [u("@%s=%r") % (k, v) for k, v in iteritems(attrs)]
477-
return u('[%s]') % ' and '.join(s)
477+
s = [u("@{key}={val!r}").format(key=k, val=v) for k, v in iteritems(attrs)]
478+
return u('[{expr}]').format(expr=' and '.join(s))
478479

479480

480481
_re_namespace = {'re': 'http://exslt.org/regular-expressions'}
@@ -517,8 +518,8 @@ def _parse_tables(self, doc, match, kwargs):
517518

518519
# 1. check all descendants for the given pattern and only search tables
519520
# 2. go up the tree until we find a table
520-
query = '//table//*[re:test(text(), %r)]/ancestor::table'
521-
xpath_expr = u(query) % pattern
521+
query = '//table//*[re:test(text(), {patt!r})]/ancestor::table'
522+
xpath_expr = u(query).format(patt=pattern)
522523

523524
# if any table attributes were given build an xpath expression to
524525
# search for them
@@ -528,7 +529,8 @@ def _parse_tables(self, doc, match, kwargs):
528529
tables = doc.xpath(xpath_expr, namespaces=_re_namespace)
529530

530531
if not tables:
531-
raise ValueError("No tables found matching regex %r" % pattern)
532+
raise ValueError("No tables found matching regex {patt!r}"
533+
.format(patt=pattern))
532534
return tables
533535

534536
def _build_doc(self):
@@ -574,8 +576,9 @@ def _build_doc(self):
574576
scheme = parse_url(self.io).scheme
575577
if scheme not in _valid_schemes:
576578
# lxml can't parse it
577-
msg = ('%r is not a valid url scheme, valid schemes are '
578-
'%s') % (scheme, _valid_schemes)
579+
msg = (('{invalid!r} is not a valid url scheme, valid '
580+
'schemes are {valid}')
581+
.format(invalid=scheme, valid=_valid_schemes))
579582
raise ValueError(msg)
580583
else:
581584
# something else happened: maybe a faulty connection
@@ -670,8 +673,9 @@ def _parser_dispatch(flavor):
670673
"""
671674
valid_parsers = list(_valid_parsers.keys())
672675
if flavor not in valid_parsers:
673-
raise ValueError('%r is not a valid flavor, valid flavors are %s' %
674-
(flavor, valid_parsers))
676+
raise ValueError('{invalid!r} is not a valid flavor, valid flavors '
677+
'are {valid}'
678+
.format(invalid=flavor, valid=valid_parsers))
675679

676680
if flavor in ('bs4', 'html5lib'):
677681
if not _HAS_HTML5LIB:
@@ -695,7 +699,7 @@ def _parser_dispatch(flavor):
695699

696700

697701
def _print_as_set(s):
698-
return '{%s}' % ', '.join([pprint_thing(el) for el in s])
702+
return '{{arg}}'.format(arg=', '.join([pprint_thing(el) for el in s]))
699703

700704

701705
def _validate_flavor(flavor):
@@ -705,21 +709,23 @@ def _validate_flavor(flavor):
705709
flavor = flavor,
706710
elif isinstance(flavor, collections.Iterable):
707711
if not all(isinstance(flav, string_types) for flav in flavor):
708-
raise TypeError('Object of type %r is not an iterable of strings' %
709-
type(flavor).__name__)
712+
raise TypeError('Object of type {typ!r} is not an iterable of '
713+
'strings'
714+
.format(typ=type(flavor).__name__))
710715
else:
711-
fmt = '{0!r}' if isinstance(flavor, string_types) else '{0}'
716+
fmt = '{flavor!r}' if isinstance(flavor, string_types) else '{flavor}'
712717
fmt += ' is not a valid flavor'
713-
raise ValueError(fmt.format(flavor))
718+
raise ValueError(fmt.format(flavor=flavor))
714719

715720
flavor = tuple(flavor)
716721
valid_flavors = set(_valid_parsers)
717722
flavor_set = set(flavor)
718723

719724
if not flavor_set & valid_flavors:
720-
raise ValueError('%s is not a valid set of flavors, valid flavors are '
721-
'%s' % (_print_as_set(flavor_set),
722-
_print_as_set(valid_flavors)))
725+
raise ValueError('{invalid} is not a valid set of flavors, valid '
726+
'flavors are {valid}'
727+
.format(invalid=_print_as_set(flavor_set),
728+
valid=_print_as_set(valid_flavors)))
723729
return flavor
724730

725731

pandas/io/json/json.py

+12-11
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class SeriesWriter(Writer):
9999
def _format_axes(self):
100100
if not self.obj.index.is_unique and self.orient == 'index':
101101
raise ValueError("Series index must be unique for orient="
102-
"'%s'" % self.orient)
102+
"'{orient}'".format(orient=self.orient))
103103

104104

105105
class FrameWriter(Writer):
@@ -110,11 +110,11 @@ def _format_axes(self):
110110
if not self.obj.index.is_unique and self.orient in (
111111
'index', 'columns'):
112112
raise ValueError("DataFrame index must be unique for orient="
113-
"'%s'." % self.orient)
113+
"'{orient}'.".format(orient=self.orient))
114114
if not self.obj.columns.is_unique and self.orient in (
115115
'index', 'columns', 'records'):
116116
raise ValueError("DataFrame columns must be unique for orient="
117-
"'%s'." % self.orient)
117+
"'{orient}'.".format(orient=self.orient))
118118

119119

120120
class JSONTableWriter(FrameWriter):
@@ -134,8 +134,9 @@ def __init__(self, obj, orient, date_format, double_precision,
134134

135135
if date_format != 'iso':
136136
msg = ("Trying to write with `orient='table'` and "
137-
"`date_format='%s'`. Table Schema requires dates "
138-
"to be formatted with `date_format='iso'`" % date_format)
137+
"`date_format='{fmt}'`. Table Schema requires dates "
138+
"to be formatted with `date_format='iso'`"
139+
.format(fmt=date_format))
139140
raise ValueError(msg)
140141

141142
self.schema = build_table_schema(obj)
@@ -166,8 +167,8 @@ def __init__(self, obj, orient, date_format, double_precision,
166167

167168
def write(self):
168169
data = super(JSONTableWriter, self).write()
169-
serialized = '{{"schema": {}, "data": {}}}'.format(
170-
dumps(self.schema), data)
170+
serialized = '{{"schema": {schema}, "data": {data}}}'.format(
171+
schema=dumps(self.schema), data=data)
171172
return serialized
172173

173174

@@ -391,8 +392,8 @@ def __init__(self, json, orient, dtype=True, convert_axes=True,
391392
if date_unit is not None:
392393
date_unit = date_unit.lower()
393394
if date_unit not in self._STAMP_UNITS:
394-
raise ValueError('date_unit must be one of %s' %
395-
(self._STAMP_UNITS,))
395+
raise ValueError('date_unit must be one of {units}'
396+
.format(units=self._STAMP_UNITS))
396397
self.min_stamp = self._MIN_STAMPS[date_unit]
397398
else:
398399
self.min_stamp = self._MIN_STAMPS['s']
@@ -410,8 +411,8 @@ def check_keys_split(self, decoded):
410411
bad_keys = set(decoded.keys()).difference(set(self._split_keys))
411412
if bad_keys:
412413
bad_keys = ", ".join(bad_keys)
413-
raise ValueError(u("JSON data had unexpected key(s): %s") %
414-
pprint_thing(bad_keys))
414+
raise ValueError(u("JSON data had unexpected key(s): {bad_keys}")
415+
.format(bad_keys=pprint_thing(bad_keys)))
415416

416417
def parse(self):
417418

0 commit comments

Comments
 (0)