Birçok docx dosyasında üstbilgileri ve altbilgileri kaldırmalıyım. Şu anda python-docx kütüphanesini kullanmaya çalışıyordum, ancak şu anda docx belgesinde üstbilgi ve altbilgiyi desteklemiyor (devam ediyor).Python - Üstbilgi ve altbilgiyi docx dosyasından kaldır
Python'da bunu başarmanın bir yolu var mı?
Anladığım kadarıyla, docx xml tabanlı bir biçimdir, ancak nasıl kullanılacağını bilmiyorum.
p.s.i'ye xml ayrıştırmak ve bazı parçaların değiştirilmesi için LXML veya BeautifulSoup kullanmak için bir fikrim var, ama o kirli
UPD'yi görünüyor. İyi bir başlangıç noktası için Shawn'a teşekkürler. Senaryoda bazı değişiklikler yaptım. Bu benim son sürümü (benim için yararlıdır, çünkü birçok .docx dosyasını düzenlemem gerek. BeautifulSoup kullanıyorum çünkü standart xml ayrıştırıcı geçerli bir xml ağacı alamıyor. xml üstbilgi ve altbilgi. Onlar sadece sayfanın bir üst başlığının ve altbilginin yerleştirilen görüntüler. Ayrıca, daha çok hız için yerine çorbası lxml kullanabilirsiniz. Yani
import zipfile
import shutil as su
import os
import tempfile
from bs4 import BeautifulSoup
def get_xml_from_docx(docx_filename):
"""
Return content of document.xml file inside docx document
"""
with zipfile.ZipFile(docx_filename) as zf:
xml_info = zf.read('word/document.xml')
return xml_info
def write_and_close_docx(self, edited_xml, output_filename):
""" Create a temp directory, expand the original docx zip.
Write the modified xml to word/document.xml
Zip it up as the new docx
"""
tmp_dir = tempfile.mkdtemp()
with zipfile.ZipFile(self) as zf:
zf.extractall(tmp_dir)
with open(os.path.join(tmp_dir, 'word/document.xml'), 'w') as f:
f.write(str(edited_xml))
# Get a list of all the files in the original docx zipfile
filenames = zf.namelist()
# Now, create the new zip file and add all the filex into the archive
zip_copy_filename = output_filename
docx = zipfile.ZipFile(zip_copy_filename, "w")
for filename in filenames:
docx.write(os.path.join(tmp_dir, filename), filename)
# Clean up the temp dir
su.rmtree(tmp_dir)
if __name__ == '__main__':
directory = 'your_directory/'
files = os.listdir(directory)
for file in files:
if file.endswith('.docx'):
word_doc = directory + file
new_word_doc = 'edited/' + file.rstrip('.docx') + '-edited.docx'
tree = get_xml_from_docx(word_doc)
soup = BeautifulSoup(tree, 'xml')
shapes = soup.find_all('shape')
for shape in shapes:
if 'margin-left:0pt' in shape.get('style'):
shape.parent.decompose()
write_and_close_docx(word_doc, soup, new_word_doc)
, işte bu :) biliyorum, Kod temiz değil, bunun için üzgünüm.
Teşekkür ederiz! Bu kod işe yaramadı, ama bazı refactoring sonra ben yapıldı! Tekrar teşekkürler! – drjackild
@drackild, iyi. düzeltilmesi gereken ne? yayınla ve paylaşalım :) –