63229


あるフォルダーに保管されたWordファイルを読み込み、特定の加工をするプログラムを作成しています。

その前提として、①Directory取得⇒②docx.document(Filepath：変数)でFile読み込み、の2段階処理を想定しています。加工の都合上、win32comではなく、docxでの処理を希望しています。

しかしながら、以下コードでの読み込みがエラーとなってしまいます。どなたかアドバイスを頂けないでしょうか？

当方の環境は、Windows10, Python3.8です。

**エラーメッセージ：**

[code]

    AttributeError: 'list' object has no attribute 'seek'
    
[/code]

**ソースコード**

[code]

    import os
    import pathlib
    import sys
    from docx import Document
    
    path = os.getcwd()
    folder = path + "\pywork\Translate"
    WordFolder = pathlib.Path(folder)
    Filepath=[ str(p) for p in WordFolder.iterdir()]
    Filename=[p.name for p in WordFolder.iterdir() if p.is_file()]
    
    for i in range(1, len(Filepath)+1):
        doc = Document(Filepath)
    
[/code]


CC BY-SA 4.0
2020-02-21T03:38:22.927
63226
2020-02-21T09:32:11.290
2020-02-21T05:07:42.000
3060
37905
question
python python3
Python-docx.document メソッドで使用可能なDirectory Pathの取得


プログラムが作成途中で、使う予定の諸々が残っているようではっきりしませんが、直接的には以下が原因でしょう。

`Filepath`はリストなので`Document()`の引数に指定するのは適切ではありません。リストから１つのファイルのパスを取り出して指定する必要があります。

その他、質問内容には直接関係無い部分で、以下の点がおかしいですが、それは質問作成時の絞り込み不足とかでしょう。

  * `Filepath`にディレクトリやWordファイルではないファイルが含まれてしまう
  * `Filename`が作成されただけで何も使われていない
  * `for`文の`i`の値が何を意味しているか不明で、かつ使われていない
  * ディレクトリ内にWordファイルが複数あっても`doc`は最後の１つしか有効にならない

Wordファイルのパスを取得して、それをすべてOpenする処理は以下になります。

  * `Filepath`はWordファイルのみを抽出してリストにする
  * `for`ループは`Filepath`リストを対象に行う
  * Document()にはファイル名を指定し、出来たオブジェクトはリストにしておく

`docs`がOpenしたWordファイルオブジェクトのリストになります。

[code]

    import os
    import pathlib
    import sys
    from docx import Document
    
    path = os.getcwd()
    folder = path + "\pywork\Translate"
    WordFolder = pathlib.Path(folder)
    
    Filepath=[str(p) for p in WordFolder.glob("*.docx") if p.is_file()] # 直接の質問の答え1/3
    
    docs = []
    for wordfile in Filepath: # 直接の質問の答え2/3
        docs.append(Document(wordfile)) # 直接の質問の答え3/3
    
[/code]

* * *

**コメント対応追記**

複数のファイル間で情報のやり取りや連携を行う必要が無いなら、`docs`リストを作らずに、`for`のループの中で1つのファイルに対する処理を完結させるのが簡単でしょう。

[code]

    # docs = [] は不要なので削除
    for wordfile in Filepath:
        doc = Document(wordfile)
    
        #...
        # 1つの文書に対する処理
        #...
    
        newname = os.path.splitext(wordfile)[0] + "_Translated.docx"
        doc.save(newname)
    
[/code]

あるいは文書間の連携があるなら、以下のように文書オブジェクトとパスを何かで対にして保持しておき、処理後の最後に`for`でセーブするとか。

[code]

    docs = []
    for wordfile in Filepath:
        # 文書オブジェクトとパスを対にして2次元リスト(辞書/タプル等でも可)で保持
        docs.append([Document(wordfile), wordfile])
    
    # ...
    # リストの m 番目の文書の処理
    # docs[m][0].何かの処理
    # リストの n 番目の文書の処理
    # docs[n][0].何かの処理
    # ...
    
    # 名前を変えてセーブ
    for entry in docs:
        newname = os.path.splitext(entry[1])[0] + "_Translated.docx"
        entry[0].save(newname)
    
[/code]


CC BY-SA 4.0
2020-02-21T05:02:38.657
63229
2020-02-21T09:32:11.290
2020-02-21T09:32:11.290
26370
26370
63226
answer