メタデータを更新する必要があるフォルダとサブフォルダに約300のdocxファイルがあります。私はメタデータを含む別々の300行以上のcsvファイルを持っています:各行はファイル名、キーワード、行のタイトルを含んでいます。python-docxを使用して多数のファイルのdocxメタデータを更新します
私は、csvからコンテンツをプルするdocxファイルをループし、そのメタデータをdocxファイルに挿入したいと考えています。 Docxファイルは、ルートフォルダから2つのサブフォルダに格納されます。
これまでのところ、私は次のことを説明しました。私が苦労しているのは、csvファイルをループする方法と、各ファイルにメタデータを順番に適用する方法です。私はこのアプローチに比較的容易な方法があると確信しています。ループを設定し、csvのコンテンツを取得するのは、私が紛失した場所です。私はノブなので、私が行くように自分のやり方を感じる。
ヒントありがとうございます。
#running in python 3.5.2 32bit
import csv
from docx import Document
import os
import sys
csv_path = ("datasheet_metadata_uplift.csv")
def update_docx_metadata(document, keywords, title):
"""
Update the *keywords*, and *title* metadata
properties in *document*.
"""
core_properties = document.core_properties
core_properties.keywords = keywords
core_properties.title = title
def read_csv_lines(filename, keywords, title):
"""
Reads the csv lines, returns *filename*, *keywords*, *title*
"""
with open(csv_path, 'r') as f:
csv_file = csv.reader(f)
for row in csv_file:
filename = row[0]
keywords = row[1]
title = row[2]
def open_docx(filename):
"""
Search for docx file and open it
"""
for root, dirs, files in os.walk("."):
if filename in files:
doc_path = os.path.join(path, filename)
csv_lines = read_csv_lines(filename, keywords, title)
for filename, keywords, title in csv_lines:
document = Document(doc_path)
update_doc_metadata(filename, keywords, title)
document.save(doc_path)
こんにちはスカニー - ありがとう!非常に有用な答え、私はあなたが示唆するように機能を使用するためにリファクタリングしてきましたが、何かが正しくないです。私は、 'NameError:name 'ファイル名の'定義されていません 'というコードの最後の部分に関連するエラーを取得します。元の投稿を新しいコードで更新しました。 どのような考えですか? – Aidan
@Aidan私はあなたがPythonで関数のパラメータの役割を混乱させるかもしれないと思います。彼らは値を*関数に入れるが、一般的には* out *ではない。そのためにはreturn文が必要です。だから、read_csv_linesはパラメータとしてcsv_pathを取って、(ファイル名、キーワード、タイトル)シーケンス(たぶんタプル)のシーケンス(おそらくリスト)を返してください。 read_csv_linesの返り値は 'return [row for row in csv_file]'だと思います。 Pythonのチュートリアルのリソースのいくつかを見つけることができます。私は[この1つ](https://pymotw.com/3/)が好きで、Pythonの公式チュートリアルもかなり良いです:) – scanny
あなたの助けを借りてくれてありがとう、私は今日これを見ていたことを実感しました。 – Aidan