can't open word document after string replacements

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Antoine De Groote

    #1

    can't open word document after string replacements

    Hi there,

    I have a word document containing pictures and text. This documents
    holds several 'ABCDEF' strings which serve as a placeholder for names.
    Now I want to replace these occurences with names in a list (members). I
    open both input and output file in binary mode and do the
    transformation. However, I can't open the resulting file, Word just
    telling that there was an error. Does anybody what I am doing wrong?

    Oh, and is this approach pythonic anyway? (I have a strong Java background.)

    Regards,
    antoine


    import os

    members = somelist

    os.chdir(somefo lder)

    doc = file('ttt.doc', 'rb')
    docout = file('ttt1.doc' , 'wb')

    counter = 0

    for line in doc:
    while line.find('ABCD EF') -1:
    try:
    line = line.replace('A BCDEF', members[counter], 1)
    docout.write(li ne)
    counter += 1
    except:
    docout.write(li ne.replace('ABC DEF', '', 1))
    else:
    docout.write(li ne)

    doc.close()
    docout.close()

  • Daniel Dittmar

    #2
    Re: can't open word document after string replacements

    Antoine De Groote wrote:
    I have a word document containing pictures and text. This documents
    holds several 'ABCDEF' strings which serve as a placeholder for names.
    Now I want to replace these occurences with names in a list (members). I
    open both input and output file in binary mode and do the
    transformation. However, I can't open the resulting file, Word just
    telling that there was an error. Does anybody what I am doing wrong?
    The Word document format probably contains some length information about
    paragraphs etc. If you change a string to another one of a different
    length, this length information will no longer match the data and the
    document structure will be hosed.

    Possible solutions:
    1. Use OLE automation (in the python win32 package) to open the file in
    Word and use Word search and replace. Your script could then directly
    print the document, which you probably have to do anyway.

    2. Export the template document to RTF. This is a text format and can be
    more easily manipulated with Python.
    for line in doc:
    I don't think that what you get here is actually a line of you document.
    Due to the binary nature of the format, it is an arbitrary chunk.

    Daniel

    Comment

    • Bruno Desthuilliers

      #3
      Re: can't open word document after string replacements

      Antoine De Groote wrote:
      Hi there,
      >
      I have a word document containing pictures and text. This documents
      holds several 'ABCDEF' strings which serve as a placeholder for names.
      Now I want to replace these occurences with names in a list (members).
      Do you know that MS Word already provides this kind of features ?
      I
      open both input and output file in binary mode and do the
      transformation. However, I can't open the resulting file, Word just
      telling that there was an error. Does anybody what I am doing wrong?
      Hand-editing a non-documented binary format may lead to undesirable
      results...
      Oh, and is this approach pythonic anyway?
      The pythonic approach is usually to start looking for existing
      solutions... In this case, using Word's builtin features and Python/COM
      integration would be a better choice IMHO.
      (I have a strong Java
      background.)
      Nobody's perfect !-)
      Regards,
      antoine
      >
      >
      import os
      >
      members = somelist
      >
      os.chdir(somefo lder)
      >
      doc = file('ttt.doc', 'rb')
      docout = file('ttt1.doc' , 'wb')
      >
      counter = 0
      >
      for line in doc:
      Since you opened the file as binary, you should use file.read() instead.
      Ever wondered what your 'lines' look like ?-)
      while line.find('ABCD EF') -1:
      ..doc is a binary format. You may find such a byte sequence in it's
      content in places that are *not* text content.
      try:
      line = line.replace('A BCDEF', members[counter], 1)
      docout.write(li ne)
      You're writing back the whole chunk on each iteration. No surprise the
      resulting document is corrupted.
      counter += 1
      seq = list("abcd")
      for indice, item in enumerate(seq):
      print "%02d : %s" % (indice, item)

      except:
      docout.write(li ne.replace('ABC DEF', '', 1))
      else:
      docout.write(li ne)
      >
      doc.close()
      docout.close()
      >


      --
      bruno desthuilliers
      python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
      p in 'onurb@xiludom. gro'.split('@')])"

      Comment

      • Jon Clements

        #4
        Re: can't open word document after string replacements


        Antoine De Groote wrote:
        Hi there,
        >
        I have a word document containing pictures and text. This documents
        holds several 'ABCDEF' strings which serve as a placeholder for names.
        Now I want to replace these occurences with names in a list (members). I
        open both input and output file in binary mode and do the
        transformation. However, I can't open the resulting file, Word just
        telling that there was an error. Does anybody what I am doing wrong?
        >
        Oh, and is this approach pythonic anyway? (I have a strong Java background.)
        >
        Regards,
        antoine
        >
        >
        import os
        >
        members = somelist
        >
        os.chdir(somefo lder)
        >
        doc = file('ttt.doc', 'rb')
        docout = file('ttt1.doc' , 'wb')
        >
        counter = 0
        >
        for line in doc:
        while line.find('ABCD EF') -1:
        try:
        line = line.replace('A BCDEF', members[counter], 1)
        docout.write(li ne)
        counter += 1
        except:
        docout.write(li ne.replace('ABC DEF', '', 1))
        else:
        docout.write(li ne)
        >
        doc.close()
        docout.close()
        Errr.... I wouldn't even attempt to do this; how do you know each
        'line' isn't going to be split arbitarily, and that 'ABCDEF' doesn't
        happen to be part of an image. As you've noted, this is binary data so
        you can't assume anything about it. Doing it this way is a Bad Idea
        (tm).

        If you want to do something like this, why not use templated HTML, or
        possibly templated PDFs? Or heaven forbid, Word's mail-merge facility?


        (I think MS Office documents are effectively self-contained file
        systems, so there is probably some module out there which can
        read/write them).

        Jon.

        Comment

        • Antoine De Groote

          #5
          Re: can't open word document after string replacements

          Thank you all for your comments.

          I ended up saving the word document in XML and then using (a slightly
          modified version of) my script of the OP. For those interested, there
          was also a problem with encodings.

          Regards,
          antoine

          Comment

          • Antoine De Groote

            #6
            Re: can't open word document after string replacements

            Bruno Desthuilliers wrote:
            Antoine De Groote wrote:
            >Hi there,
            >>
            >I have a word document containing pictures and text. This documents
            >holds several 'ABCDEF' strings which serve as a placeholder for names.
            >Now I want to replace these occurences with names in a list (members).
            >
            Do you know that MS Word already provides this kind of features ?

            No, I don't. Sounds interesting... What is this feature called?
            >
            >I
            >open both input and output file in binary mode and do the
            >transformation . However, I can't open the resulting file, Word just
            >telling that there was an error. Does anybody what I am doing wrong?
            >
            Hand-editing a non-documented binary format may lead to undesirable
            results...
            >
            >Oh, and is this approach pythonic anyway?
            >
            The pythonic approach is usually to start looking for existing
            solutions... In this case, using Word's builtin features and Python/COM
            integration would be a better choice IMHO.
            >
            >(I have a strong Java
            >background.)
            >
            Nobody's perfect !-)
            >
            >Regards,
            >antoine
            >>
            >>
            >import os
            >>
            >members = somelist
            >>
            >os.chdir(somef older)
            >>
            >doc = file('ttt.doc', 'rb')
            >docout = file('ttt1.doc' , 'wb')
            >>
            >counter = 0
            >>
            >for line in doc:
            >
            Since you opened the file as binary, you should use file.read() instead.
            Ever wondered what your 'lines' look like ?-)
            >
            > while line.find('ABCD EF') -1:
            >
            .doc is a binary format. You may find such a byte sequence in it's
            content in places that are *not* text content.
            >
            > try:
            > line = line.replace('A BCDEF', members[counter], 1)
            > docout.write(li ne)
            >
            You're writing back the whole chunk on each iteration. No surprise the
            resulting document is corrupted.
            >
            > counter += 1
            >
            seq = list("abcd")
            for indice, item in enumerate(seq):
            print "%02d : %s" % (indice, item)
            >
            >
            > except:
            > docout.write(li ne.replace('ABC DEF', '', 1))
            > else:
            > docout.write(li ne)
            >>
            >doc.close()
            >docout.close ()
            >>
            >
            >
            >

            Comment

            • Bruno Desthuilliers

              #7
              [OT] Re: can't open word document after string replacements

              Antoine De Groote wrote:
              Bruno Desthuilliers wrote:
              >Antoine De Groote wrote:
              >>Hi there,
              >>>
              >>I have a word document containing pictures and text. This documents
              >>holds several 'ABCDEF' strings which serve as a placeholder for names.
              >>Now I want to replace these occurences with names in a list (members).
              >>
              >Do you know that MS Word already provides this kind of features ?
              >
              >
              No, I don't. Sounds interesting... What is this feature called?
              I don't know how it's named in english, but in french it's (well - it
              was last time I used MS Word, which is quite some times ago???) "fusion
              de documents".



              --
              bruno desthuilliers
              python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
              p in 'onurb@xiludom. gro'.split('@')])"

              Comment

              • Steve Holden

                #8
                Re: can't open word document after string replacements

                Antoine De Groote wrote:
                Bruno Desthuilliers wrote:
                >
                >>Antoine De Groote wrote:
                >>
                >>>Hi there,
                >>>
                >>>I have a word document containing pictures and text. This documents
                >>>holds several 'ABCDEF' strings which serve as a placeholder for names.
                >>>Now I want to replace these occurences with names in a list (members).
                >>
                >>Do you know that MS Word already provides this kind of features ?
                >
                >
                >
                No, I don't. Sounds interesting... What is this feature called?
                >
                Mail-merge, I believe.

                However, if your document can be adequately represented in RTF
                (rich-text format) then you could consider doing string replacements on
                that. I invoice the PyCon sponsors using this rather inelegant technique.

                regards
                Steve
                --
                Steve Holden +44 150 684 7255 +1 800 494 3119
                Holden Web LLC/Ltd http://www.holdenweb.com
                Skype: holdenweb http://holdenweb.blogspot.com
                Recent Ramblings http://del.icio.us/steve.holden

                Comment

                • Richie Hindle

                  #9
                  Re: [OT] Re: can't open word document after string replacements


                  [Antoine]
                  I have a word document containing pictures and text. This documents
                  holds several 'ABCDEF' strings which serve as a placeholder for names.
                  Now I want to replace these occurences with names in a list (members).
                  [Bruno]
                  I don't know how it's named in english, but in french it's (well - it
                  was last time I used MS Word, which is quite some times ago???) "fusion
                  de documents".
                  "Mail Merge"?

                  --
                  Richie Hindle
                  richie@entrian. com

                  Comment

                  • Frederic Rentsch

                    #10
                    Re: can't open word document after string replacements

                    Antoine De Groote wrote:
                    Hi there,
                    >
                    I have a word document containing pictures and text. This documents
                    holds several 'ABCDEF' strings which serve as a placeholder for names.
                    Now I want to replace these occurences with names in a list (members). I
                    open both input and output file in binary mode and do the
                    transformation. However, I can't open the resulting file, Word just
                    telling that there was an error. Does anybody what I am doing wrong?
                    >
                    Oh, and is this approach pythonic anyway? (I have a strong Java background.)
                    >
                    Regards,
                    antoine
                    >
                    >
                    import os
                    >
                    members = somelist
                    >
                    os.chdir(somefo lder)
                    >
                    doc = file('ttt.doc', 'rb')
                    docout = file('ttt1.doc' , 'wb')
                    >
                    counter = 0
                    >
                    for line in doc:
                    while line.find('ABCD EF') -1:
                    try:
                    line = line.replace('A BCDEF', members[counter], 1)
                    docout.write(li ne)
                    counter += 1
                    except:
                    docout.write(li ne.replace('ABC DEF', '', 1))
                    else:
                    docout.write(li ne)
                    >
                    doc.close()
                    docout.close()
                    >
                    >
                    DOC files contain housekeeping info which becomes inconsistent if you
                    change text. Possibly you can exchange stuff of equal length but that
                    wouldn't serve your purpose. RTF files let you do substitutions and they
                    save a lot of space too. But I kind of doubt whether RTF files can
                    contain pictures.

                    Frederic



                    Comment

                    • Duncan Booth

                      #11
                      Re: can't open word document after string replacements

                      Frederic Rentsch <anthra.norell@ vtxmail.chwrote :
                      DOC files contain housekeeping info which becomes inconsistent if you
                      change text. Possibly you can exchange stuff of equal length but that
                      wouldn't serve your purpose. RTF files let you do substitutions and they
                      save a lot of space too. But I kind of doubt whether RTF files can
                      contain pictures.
                      They wouldn't be a lot of use as a document file format if they couldn't
                      contain pictures. RTF files can contain just about anything, they can even
                      embed other non-rtf objects. Whether rtf applications apart from Word can
                      actually handle all of the tags is, of course, another question.

                      Comment

                      Working...