diff --git a/.gitignore b/.gitignore index fa629db75..6b9f41415 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,8 @@ __pycache__/ /Code/GraphMol/Depictor/test_data/collisions.out.sdf /Code/GraphMol/Depictor/test_data/first_200.out.sdf /Code/GraphMol/Depictor/test_data/test1.out.sdf +/Code/GraphMol/Depictor/test_data/constrainedCoords.out.sdf + /Code/GraphMol/FileParsers/test_data/blah.sdf /Code/GraphMol/FileParsers/test_data/cdk2_stereo.sdf diff --git a/rdkit/sping/PDF/pdfdoc.py b/rdkit/sping/PDF/pdfdoc.py index adb431a1f..a6cfefb3f 100755 --- a/rdkit/sping/PDF/pdfdoc.py +++ b/rdkit/sping/PDF/pdfdoc.py @@ -16,7 +16,6 @@ piddlePDF calls pdfgen and offers a high-level interface. from __future__ import print_function import os import sys -import string import time import tempfile from types import * @@ -264,7 +263,7 @@ class OutputGrabber: self.data.append(x) def getData(self): - return string.join(self.data) + return ' '.join(self.data) def close(self): sys.stdout = self.oldoutput @@ -321,9 +320,9 @@ class PDFCatalog(PDFObject): "requires RefPages and RefOutlines set" def __init__(self): - self.template = string.join([ + self.template = LINEEND.join([ '<<', '/Type /Catalog', '/Pages %d 0 R', '/Outlines %d 0 R', '>>' - ], LINEEND) + ]) def save(self, file): file.write(self.template % (self.RefPages, self.RefOutlines) + LINEEND) @@ -344,10 +343,10 @@ class PDFInfo(PDFObject): def save(self, file): file.write( - string.join([ + LINEEND.join([ "<>" - ], LINEEND) % (pdfutils._escape(self.title), pdfutils._escape(self.author), self.datestr, + ]) % (pdfutils._escape(self.title), pdfutils._escape(self.author), self.datestr, pdfutils._escape(self.subject)) + LINEEND) @@ -355,7 +354,7 @@ class PDFOutline(PDFObject): "null outline, does nothing yet" def __init__(self): - self.template = string.join(['<<', '/Type /Outlines', '/Count 0', '>>'], LINEEND) + self.template = LINEEND.join(['<<', '/Type /Outlines', '/Count 0', '>>']) def save(self, file): file.write(self.template + LINEEND) @@ -373,7 +372,7 @@ class PDFPageCollection(PDFObject): lines.append(str(page) + ' 0 R ') lines.append(']') lines.append('>>') - text = string.join(lines, LINEEND) + text = LINEEND.join(lines) file.write(text + LINEEND) @@ -391,7 +390,7 @@ class PDFPage(PDFObject): self.pageTransitionString = '' # presentation effects # editors on different systems may put different things in the line end # without me noticing. No triple-quoted strings allowed! - self.template = string.join([ + self.template = LINEEND.join([ '<<', '/Type /Page', '/Parent %(parentpos)d 0 R', @@ -404,8 +403,7 @@ class PDFPage(PDFObject): '/Contents %(contentspos)d 0 R', '%(transitionString)s', '>>' - ], - LINEEND) + ]) def setCompression(self, onoff=0): "Turns page compression on or off" @@ -428,8 +426,8 @@ class PDFPage(PDFObject): self.drawables = [] def setStream(self, data): - if type(data) is ListType: - data = string.join(data, LINEEND) + if isinstance(data, (list, tuple)): + data = LINEEND.join(data, LINEEND) self.stream.setStream(data) @@ -477,13 +475,13 @@ class PDFImage(PDFObject): # sample one while developing. Currently, images go in a literals def save(self, file): file.write( - string.join([ + LINEEND.join([ '<<', '/Type /XObject', '/Subtype /Image', '/Name /Im0', '/Width 24', '/Height 23', '/BitsPerComponent 1', '/ColorSpace /DeviceGray', '/Filter /ASCIIHexDecode', '/Length 174', '>>', 'stream', '003B00 002700 002480 0E4940 114920 14B220 3CB650', '75FE88 17FF8C 175F14 1C07E2 3803C4 703182 F8EDFC', 'B2BBC2 BB6F84 31BFC2 18EA3C 0E3E00 07FC00 03F800', '1E1800 1FF800>', 'endstream', 'endobj' - ], LINEEND) + LINEEND) + ]) + LINEEND) class PDFType1Font(PDFObject): @@ -491,10 +489,10 @@ class PDFType1Font(PDFObject): def __init__(self, key, font): self.fontname = font self.keyname = key - self.template = string.join([ + self.template = LINEEND.join([ '<<', '/Type /Font', '/Subtype /Type1', '/Name /%s', '/BaseFont /%s', '/Encoding /MacRomanEncoding', '>>' - ], LINEEND) + ]) def save(self, file): file.write(self.template % (self.keyname, self.fontname) + LINEEND) diff --git a/rdkit/sping/PDF/pdfgen.py b/rdkit/sping/PDF/pdfgen.py index c34f10053..59d969bf2 100755 --- a/rdkit/sping/PDF/pdfgen.py +++ b/rdkit/sping/PDF/pdfgen.py @@ -53,7 +53,6 @@ Progress Reports: from __future__ import print_function import os import sys -import string import time import tempfile from io import StringIO @@ -64,6 +63,7 @@ from . import pdfutils from . import pdfdoc from . import pdfmetrics from . import pdfgeom +from rdkit.six import string_types class PDFError(ValueError): @@ -172,8 +172,8 @@ class Canvas: """PDF escapes are like Python ones, but brackets need slashes before them too. Use Python's repr function and chop off the quotes first""" s = repr(s)[1:-1] - s = string.replace(s, '(', '\(') - s = string.replace(s, ')', '\)') + s = s.replace('(', '\(') + s = s.replace(')', '\)') return s #info functions - non-standard @@ -515,11 +515,11 @@ class Canvas: def setDash(self, array=[], phase=0): """Two notations. pass two numbers, or an array and phase""" - if type(array) == IntType or type(array) == FloatType: + if isinstance(array, (int, float)): self._code.append('[%s %s] 0 d' % (array, phase)) - elif type(array) == ListType or type(array) == TupleType: + elif isinstance(array, (list, tuple)): assert phase <= len(array), "setDash phase must be l.t.e. length of array" - textarray = string.join(map(str, array)) + textarray = ' '.join(map(str, array)) self._code.append('[%s] %s d' % (textarray, phase)) def setFillColorRGB(self, r, g, b): @@ -576,8 +576,7 @@ class Canvas: return self._currentPageHasImages = 1 - - if type(image) == StringType: + if isinstance(image, string_types): if os.path.splitext(image)[1] in ['.jpg', '.JPG']: #directly process JPEG files #open file, needs some error handling!! @@ -615,12 +614,12 @@ class Canvas: cachedname = os.path.splitext(image)[0] + '.a85' imagedata = open(cachedname, 'rb').readlines() #trim off newlines... - imagedata = map(string.strip, imagedata) + imagedata = [s.strip() for s in imagedata] #parse line two for width, height - words = string.split(imagedata[1]) - imgwidth = string.atoi(words[1]) - imgheight = string.atoi(words[3]) + words = imagedata[1].split() + imgwidth = int(words[1]) + imgheight = int(words[3]) else: #PIL Image #work out all dimensions @@ -789,7 +788,7 @@ class Canvas: return self._pageTransitionString = ( - ('/Trans <>') + ('/Trans <>') class PDFPathObject: @@ -808,7 +807,7 @@ class PDFPathObject: def getCode(self): "pack onto one line; used internally" - return string.join(self._code, ' ') + return ' '.join(self._code) def moveTo(self, x, y): self._code.append('%0.4f %0.4f m' % (x, y)) @@ -892,7 +891,7 @@ class PDFTextObject: def getCode(self): "pack onto one line; used internally" self._code.append('ET') - return string.join(self._code, ' ') + return ' '.join(self._code) def setTextOrigin(self, x, y): if self._canvas.bottomup: @@ -1021,13 +1020,11 @@ class PDFTextObject: since this may be indented, by default it trims whitespace off each line and from the beginning; set trim=0 to preserve whitespace.""" - if type(stuff) == StringType: - lines = string.split(string.strip(stuff), '\n') + if isinstance(stuff, string_types): + lines = stuff.strip().split('\n') if trim == 1: - lines = map(string.strip, lines) - elif type(stuff) == ListType: - lines = stuff - elif type(stuff) == TupleType: + lines = [s.strip() for s in lines] + elif isinstance(stuff, (tuple, list)): lines = stuff else: raise ValueError("argument to textlines must be string, list or tuple") diff --git a/rdkit/sping/PDF/pdfmetrics.py b/rdkit/sping/PDF/pdfmetrics.py index ba84594f6..51abaf5f1 100755 --- a/rdkit/sping/PDF/pdfmetrics.py +++ b/rdkit/sping/PDF/pdfmetrics.py @@ -3,28 +3,28 @@ be used for any other PIDDLE back ends or packages which use the standard Type 1 postscript fonts. -Its main function is to let you work out the width of strings; it exposes a -single function, stringwidth(text, fontname), which works out the width of a +Its main function is to let you work out the width of strings; it exposes a +single function, stringwidth(text, fontname), which works out the width of a string in the given font. This is an integer defined in em-square units - each character is defined in a 1000 x 1000 box called the em-square - for a 1-point high character. So to convert to points, multiply by 1000 and then by point size. The AFM loading stuff worked for me but is not being heavily tested, as pre-canning the widths for the standard 14 fonts in Acrobat Reader is so much more useful. One -could easily extend it to get the exact bounding box for each characterm useful for +could easily extend it to get the exact bounding box for each characterm useful for kerning. The ascent_descent attribute of the module is a dictionary mapping font names (with the proper Postscript capitalisation) to ascents and descents. I ought -to sort out the fontname case issue and the resolution of PIDDLE fonts to +to sort out the fontname case issue and the resolution of PIDDLE fonts to Postscript font names within this module, but have not yet done so. 13th June 1999 """ from __future__ import print_function -import string, os +import os StandardEnglishFonts = [ 'Courier', 'Courier-Bold', 'Courier-Oblique', 'Courier-BoldOblique', 'Helvetica', @@ -251,25 +251,25 @@ def parseAFMfile(filename): metriclines = [] between = 0 for line in alllines: - if string.find(string.lower(line), 'endcharmetrics') > -1: + if 'endcharmetrics' in line.lower(): between = 0 break if between: metriclines.append(line) - if string.find(string.lower(line), 'startcharmetrics') > -1: + if 'startcharmetrics' in line.lower(): between = 1 # break up - very shaky assumption about array size widths = [0] * 255 for line in metriclines: - chunks = string.split(line, ';') + chunks = line.split(';') - (c, cid) = string.split(chunks[0]) - (wx, width) = string.split(chunks[1]) + (c, cid) = chunks[0].split() + (wx, width) = chunks[1].split() #(n, name) = string.split(chunks[2]) #(b, x1, y1, x2, y2) = string.split(chunks[3]) - widths[string.atoi(cid)] = string.atoi(width) + widths[int(cid)] = int(width) # by default, any empties should get the width of a space for i in range(len(widths)): diff --git a/rdkit/sping/PDF/pdfutils.py b/rdkit/sping/PDF/pdfutils.py index 44bc045f4..3e811335e 100755 --- a/rdkit/sping/PDF/pdfutils.py +++ b/rdkit/sping/PDF/pdfutils.py @@ -2,7 +2,6 @@ # compression, and some constants from __future__ import print_function import os -import string from io import StringIO from rdkit.six import string_types import glob @@ -47,7 +46,7 @@ def cacheImageFile(filename): #save it to a file cachedname = os.path.splitext(filename)[0] + '.a85' f = open(cachedname, 'wb') - f.write(string.join(code, LINEEND) + LINEEND) + f.write(LINEEND.join(code) + LINEEND) f.close() print('cached image as %s' % cachedname) @@ -96,18 +95,18 @@ def _escape(s): need slashes before them too. Use Python's repr function and chop off the quotes first""" s = repr(s)[1:-1] - s = string.replace(s, '(', '\(') - s = string.replace(s, ')', '\)') + s = s.replace('(', '\(') + s = s.replace(')', '\)') return s def _normalizeLineEnds(text, desired=LINEEND): """ensures all instances of CR, LF and CRLF end up as the specified one""" unlikely = '\000\001\002\003' - text = string.replace(text, '\015\012', unlikely) - text = string.replace(text, '\015', unlikely) - text = string.replace(text, '\012', unlikely) - text = string.replace(text, unlikely, desired) + text = text.replace('\015\012', unlikely) + text = text.replace('\015', unlikely) + text = text.replace('\012', unlikely) + text = text.replace(unlikely, desired) return text @@ -126,7 +125,7 @@ def _AsciiHexEncode(input): def _AsciiHexDecode(input): "Not used except to provide a test of the preceding" #strip out all whitespace - stripped = string.join(string.split(input), '') + stripped = ''.join(input.split(), '') assert stripped[-1] == '>', 'Invalid terminator for Ascii Hex Stream' stripped = stripped[:-1] #chop off terminator assert len(stripped) % 2 == 0, 'Ascii Hex stream has odd number of bytes' @@ -226,13 +225,13 @@ def _AsciiBase85Decode(input): trip is essential for testing.""" outstream = StringIO() #strip all whitespace - stripped = string.join(string.split(input), '') + stripped = ''.join(input.split(), '') #check end assert stripped[-2:] == '~>', 'Invalid terminator for Ascii Base 85 Stream' stripped = stripped[:-2] #chop off terminator #may have 'z' in it which complicates matters - expand them - stripped = string.replace(stripped, 'z', '!!!!!') + stripped = stripped.replace('z', '!!!!!') # special rules apply if not a multiple of five bytes. whole_word_count, remainder_size = divmod(len(stripped), 5) #print '%d words, %d leftover' % (whole_word_count, remainder_size) @@ -303,7 +302,7 @@ def _wrap(input, columns=60): i = i + 1 pos = columns * i - return string.join(output, LINEEND) + return LINEEND.join(output) def _AsciiBase85Test(text='What is the average velocity of a sparrow?'): diff --git a/rdkit/sping/PDF/pidPDF.py b/rdkit/sping/PDF/pidPDF.py index 907f92ee5..287e0c81f 100755 --- a/rdkit/sping/PDF/pidPDF.py +++ b/rdkit/sping/PDF/pidPDF.py @@ -16,7 +16,6 @@ self.pdf which offers numerous lower-level drawing routines. #pylint: disable=E1103,W0311,E1101 from __future__ import print_function #standard python library modules -import string from . import pdfmetrics import glob import os @@ -24,6 +23,7 @@ import types from math import sin, cos, pi, ceil # app specific +from rdkit.six import string_types from rdkit.sping import pagesizes from rdkit.sping.pid import * from . import pdfgen @@ -174,7 +174,7 @@ class PDFCanvas(Canvas): if hasattr(file, 'write'): self.pdf.save(fileobj=file) - elif isinstance(file, types.StringType): + elif isinstance(file, string_types): self.pdf.save(filename=file) else: self.pdf.save() @@ -232,8 +232,8 @@ class PDFCanvas(Canvas): """PDF escapes are like Python ones, but brackets need slashes before them too. Use Python's repr function and chop off the quotes first""" s = repr(s)[1:-1] - s = string.replace(s, '(', '\(') - s = string.replace(s, ')', '\)') + s = s.replace('(', '\(') + s = s.replace(')', '\)') return s def resetDefaults(self): @@ -338,9 +338,9 @@ class PDFCanvas(Canvas): if col != transparent: if '\n' in s or '\r' in s: #normalize line ends - s = string.replace(s, '\r\n', '\n') - s = string.replace(s, '\n\r', '\n') - lines = string.split(s, '\n') + s = s.replace('\r\n', '\n') + s = s.replace('\n\r', '\n') + lines = s.split('\n') else: lines = [s] fnt = font or self.defaultFont diff --git a/rdkit/sping/PS/psmetrics.py b/rdkit/sping/PS/psmetrics.py index b3888a24b..6d862b616 100755 --- a/rdkit/sping/PS/psmetrics.py +++ b/rdkit/sping/PS/psmetrics.py @@ -2,7 +2,6 @@ # Christopher Lee clee@users.sourceforge.net # based upon pdfmetrics.py by Andy Robinson -import string from . import fontinfo from . import latin1MetricsCache diff --git a/rdkit/sping/Pyart/Fontmapping.py b/rdkit/sping/Pyart/Fontmapping.py index 410e69b0c..c23361962 100755 --- a/rdkit/sping/Pyart/Fontmapping.py +++ b/rdkit/sping/Pyart/Fontmapping.py @@ -3,7 +3,6 @@ # DefaultFace = 'times' -import string # these are the required fonts for piddle PidLegalFonts = {"courier": "courier", # note: keys are lowercased diff --git a/rdkit/sping/ReportLab/pidReportLab.py b/rdkit/sping/ReportLab/pidReportLab.py index d6cbc5d8d..96c7691fa 100644 --- a/rdkit/sping/ReportLab/pidReportLab.py +++ b/rdkit/sping/ReportLab/pidReportLab.py @@ -37,7 +37,7 @@ from rdkit.sping.pid import * from rdkit.sping.PDF import pidPDF, pdfmetrics from reportlab.lib import colors from reportlab.graphics import shapes -import string, os, types +import os, types from math import * diff --git a/rdkit/sping/SVG/pidSVG.py b/rdkit/sping/SVG/pidSVG.py index 23f03fae8..2db62e955 100755 --- a/rdkit/sping/SVG/pidSVG.py +++ b/rdkit/sping/SVG/pidSVG.py @@ -46,7 +46,6 @@ Greg Landrum (greglandrum@earthlink.net) 3/10/2000 from rdkit.sping.pid import * from rdkit.sping.PDF import pdfmetrics # for font info -import string from rdkit import six from math import * @@ -160,19 +159,19 @@ class SVGCanvas(Canvas): if font.face is None: font.__dict__['face'] = 'sansserif' # quick hack -cwl if isinstance(font.face, six.string_types): - if len(string.split(font.face)) > 1: + if len(font.face.split()) > 1: familyStr = '\'%s\'' % font.face else: familyStr = font.face else: face = font.face[0] - if len(string.split(face)) > 1: + if len(face.split()) > 1: familyStr = '\'%s\'' % (face) else: familyStr = face for i in xrange(1, len(font.face)): face = font.face[i] - if len(string.split(face)) > 1: + if len(face.split()) > 1: familyStr = ', \'%s\'' % (face) else: familyStr = familyStr + ', %s' % face @@ -526,7 +525,7 @@ class SVGCanvas(Canvas): xLoc = x yLoc = y outStr += '' - lines = string.split(s, '\n') + lines = s.split('\n') lineHeight = self.fontHeight(font) yP = yLoc for line in lines: diff --git a/rdkit/sping/TK/pidTK.py b/rdkit/sping/TK/pidTK.py index 1bc5b84fb..1904d43da 100755 --- a/rdkit/sping/TK/pidTK.py +++ b/rdkit/sping/TK/pidTK.py @@ -19,7 +19,6 @@ You can find the latest version of this file: import Tkinter, tkFont tk = Tkinter import rdkit.sping.pid -import string __version__ = "0.3" __date__ = "April 8, 1999" diff --git a/rdkit/sping/WX/pidWxDc.py b/rdkit/sping/WX/pidWxDc.py index cb5ae7761..e93139893 100755 --- a/rdkit/sping/WX/pidWxDc.py +++ b/rdkit/sping/WX/pidWxDc.py @@ -182,9 +182,9 @@ class PiddleWxDc(sping_pid.Canvas): if '\n' in s or '\r' in s: #normalize line ends - s = string.replace(s, '\r\n', '\n') - s = string.replace(s, '\n\r', '\n') - lines = string.split(s, '\n') + s = s.replace('\r\n', '\n') + s = s.replace('\n\r', '\n') + lines = s.split('\n') else: lines = [s] diff --git a/rdkit/sping/pid.py b/rdkit/sping/pid.py index 584792336..e31f60da8 100755 --- a/rdkit/sping/pid.py +++ b/rdkit/sping/pid.py @@ -393,14 +393,13 @@ class Canvas: def drawMultiLineString(self, s, x, y, font=None, color=None, angle=0, **kwargs): "Breaks string into lines (on \n, \r, \n\r, or \r\n), and calls drawString on each." import math - import string h = self.fontHeight(font) dy = h * math.cos(angle * math.pi / 180.0) dx = h * math.sin(angle * math.pi / 180.0) - s = string.replace(s, '\r\n', '\n') - s = string.replace(s, '\n\r', '\n') - s = string.replace(s, '\r', '\n') - lines = string.split(s, '\n') + s = s.replace('\r\n', '\n') + s = s.replace('\n\r', '\n') + s = s.replace('\r', '\n') + lines = s.split('\n') for line in lines: self.drawString(line, x, y, font, color, angle) x = x + dx diff --git a/rdkit/sping/tests/pidtest.py b/rdkit/sping/tests/pidtest.py index 6907c1cc2..800b435b0 100755 --- a/rdkit/sping/tests/pidtest.py +++ b/rdkit/sping/tests/pidtest.py @@ -4,9 +4,11 @@ This module puts the various PIDDLE backends through their paces. """ from __future__ import print_function -from sping import pagesizes -from sping.pid import * -import string +from rdkit.sping import pagesizes +from rdkit.sping.pid import * +from rdkit.six.moves import input +# The original code imported letters, a more generic lisit. This is no longer supported. +from string import ascii_letters as LETTERS import math backends = ['PDF', 'PIL', 'TK', 'PS', 'SVG', 'WX'] # 'piddleAI','piddleQD','piddleGL' ] @@ -408,18 +410,18 @@ def mainLoop(): i = i + 1 print() - inp = raw_input("Selection (0 to exit): ") + inp = input("Selection (0 to exit): ") print() if inp == '0': return if inp: testinp = '' - if inp[-1] in string.letters: + if inp[-1] in LETTERS: testinp = inp[-1] - elif inp[0] in string.letters: + elif inp[0] in LETTERS: testinp = inp[0] - backinp = string.join(filter(lambda x: x in '0123456789', inp)) + backinp = ' '.join(filter(lambda x: x in '0123456789', inp)) if backinp: backend = int(backinp) - 1 if backend < len(backends): @@ -433,7 +435,7 @@ def mainLoop(): else: backend = None if testinp: - test = ord(string.upper(testinp[0])) - ord('A') + test = ord(testinp[0].upper()) - ord('A') if test >= 0 and test < len(tests): docstr = tests[test].__doc__ if docstr: diff --git a/rdkit/sping/util/HTMLPiddler.py b/rdkit/sping/util/HTMLPiddler.py index 9df0b60c8..2d312da42 100755 --- a/rdkit/sping/util/HTMLPiddler.py +++ b/rdkit/sping/util/HTMLPiddler.py @@ -50,6 +50,8 @@ from __future__ import print_function import htmllib, formatter, string from types import * import piddle +from rdkit.six import string_types +from rdkit.six.moves import input TRACE = 0 @@ -139,7 +141,7 @@ class _HtmlPiddleWriter: points = self.DefaultFontSize if fontParams[3]: face = "courier" #"modern" - elif type(size) is StringType and size[0] == "h": + elif isinstance(size, string_types) and size[0] == "h": face = "helvetica" #"swiss" else: face = "times" #"roman" @@ -195,7 +197,7 @@ class _HtmlPiddleWriter: self.x = self.indent self.atbreak = 0 if TRACE: - raw_input('lb') + input('lb') def send_hor_rule(self): self.send_line_break() @@ -208,11 +210,11 @@ class _HtmlPiddleWriter: def send_literal_data(self, data): if not data: return - lines = string.splitfields(data, '\n') - text = string.expandtabs(lines[0]) + lines = data.split(data, '\n') + text = lines[0].replace('\t', ' '*8) for l in lines[1:]: self.OutputLine(text, 1) - text = string.expandtabs(l) + text = l.replace('\t', ' '*8) self.OutputLine(text, 0) self.atbreak = 0 @@ -222,7 +224,7 @@ class _HtmlPiddleWriter: atbreak = self.atbreak or data[0] in string.whitespace text = "" pixels = chars = 0 - for word in string.split(data): + for word in data.split(): bword = " " + word # blank + word length = len(bword) # The current line is "text" and its size is @@ -381,9 +383,9 @@ def demo(html=DEMO_HTML): #print(' 3. piddleTK') #print(' 4. piddleWX') print(' 0. EXIT') - sel = raw_input('Enter Selection Number: ') + sel = input('Enter Selection Number: ') try: - sel = string.atoi(string.strip(sel)) + sel = int(sel.strip()) except Exception: sel = -1 if (sel == 0): diff --git a/rdkit/utils/chemdraw.py b/rdkit/utils/chemdraw.py index bb2d559d0..6235acee5 100755 --- a/rdkit/utils/chemdraw.py +++ b/rdkit/utils/chemdraw.py @@ -13,7 +13,7 @@ """ from __future__ import print_function -import string, tempfile, os, time +import tempfile, os, time try: import pythoncom from win32com.client import gencache, Dispatch, constants @@ -385,7 +385,7 @@ def OptimizeSDFile(inFileName, outFileName, problemFileName='problems.sdf', rest while nextLine != '': if nextLine.find('M END') != -1: lines.append(nextLine) - molBlock = string.join(lines, '') + molBlock = ''.join(lines) try: newMolBlock = Add3DCoordsToMol(molBlock, 'chemical/mdl-molfile', props=props) @@ -410,7 +410,7 @@ def OptimizeSDFile(inFileName, outFileName, problemFileName='problems.sdf', rest for prop in props.keys(): lines.append('> <%s>\n%f\n\n' % (prop, props[prop])) lines.append(nextLine) - outFile.write(string.join(lines, '')) + outFile.write(''.join(lines)) lines = [] else: skip = 0 @@ -418,7 +418,7 @@ def OptimizeSDFile(inFileName, outFileName, problemFileName='problems.sdf', rest if problemFile is None: problemFile = open(problemFileName, 'w+') problemFile.write(badBlock) - problemFile.write(string.join(lines, '')) + problemFile.write(''.join(lines)) lines = [] else: lines.append(nextLine)