Hướng dẫn print placeholder python - in giữ chỗ python

Tôi gặp khó khăn trong việc tìm kiếm và thay thế tất cả các lần xuất hiện của một số người giữ chỗ trong các đoạn của một tệp từ. Đó là dành cho một cuốn sách game, vì vậy tôi đang cố gắng phụ các số mục nhập ngẫu nhiên cho các trình giữ chỗ được sử dụng trong khi soạn thảo cuốn sách.

Nội phân Chính showShow

  • Mở một tài liệu
  • Thêm một đoạn văn
  • Thêm một tiêu đề
  • Thêm một trang phá vỡ trang
  • Thêm một bàn
  • Thêm một bức tranh
  • Kích cỡ hình¶
  • Áp dụng một phong cách đoạn văn
  • Áp dụng táo bạo và chữ viết
  • Áp dụng một phong cách nhân vật

Tất cả các giữ chỗ bắt đầu với " #" (ví dụ: #1-5, #22-1, v.v.). Đặt số, giống như mục đầu tiên (sẽ luôn là "1"), không có tiền tố "#". Các mục nhập trình giữ chỗ được ghép nối với các đối tác ngẫu nhiên làm bộ dữ liệu bằng cách zipping trong một bộ để tham khảo.

Tất cả đều hoạt động tuyệt vời cho các tiêu đề vì nó là một hoán đổi một phần của một đoạn, theo thứ tự. Rắc rối là khi tôi lặp đi lặp lại các đoạn thông thường (thứ hai đến bit cuối cùng của mã). Nó dường như chỉ thay thế tám số đầu tiên, sau đó dừng lại. Tôi đã thử thiết lập một vòng lặp nhưng nó dường như không giúp ích gì. Không chắc chắn những gì tôi đang thiếu. Mã theo sau.

Chỉnh sửa: Đây là cách hai danh sách và bộ tple tham chiếu được thiết lập. Trong thử nghiệm này, chỉ có mục đầu tiên được đặt, không có tham chiếu trong đoạn nào về nó. Tất cả những người khác sẽ được chọn ngẫu nhiên và thay thế trong đoạn.

EntryWorking: ['#1-1', '#1-2', '#1-3', '#1-4', '#1-5', '#1-6', '#1-7 ','#1-8 ','#2 ','#2-1 ','#2-2 ','#2-3 ','#2-4 ','#2-5 ',' #2-6 ','#2-7 ','#16 ','#17 ','#3 ','#3-1 ','#3-2 ','#3-3 ',' #3-4 ','#3-5 ','#3-6 ','#3-8 ','#3-9 ']]

Entrynumbers: ['2', '20', '12', '27', '23', '4', '11', '16', '26', '7', '25', '5' , '3', '15', '17', '6', '18', '22', '10', '21', '19', '13', '28', '8', ' 14 ',' 9 ',' 24 ']

Tham khảo: (('#1-1', '2'), ('#1-2', '20'), ('#1-3', '12'), ('#1-4', '27'), ('#1-5', '23'), ('#1-6', '4'), ('#1-7', '11'), ('#1-8 ',' 16 '), ('#2 ',' 26 '), ('#2-1 ',' 7 '), ('#2-2 ',' 25 '), ('#2-3 ',' 5 '), ('#2-4 ',' 3 '), ('#2-5 ',' 15 '), ('#2-6 ',' 17 '), ('#2 -7 ',' 6 '), ('#16 ',' 18 '), ('#17 ',' 22 '), ('#3 ',' 10 '), ('#3-1 ', '21'), ('#3-2', '19'), ('#3-3', '13'), ('#3-4', '28'), ('#3-5 ',' 8 '), ('#3-6 ',' 14 '), ('#3-8 ',' 9 '), ('#3-9 ',' 24 '))

Cảm ơn sự hỗ trợ.

import sys, os, random
from docx import *

entryWorking = [] # The placeholder entries created for the draft gamebook


# Identify all paragraphs with a specific heading style (e.g. 'Heading 2')
def iter_headings( paragraphs, heading ) :
    for paragraph in paragraphs :
        if paragraph.style.name.startswith( heading ) :
            yield paragraph


# Open the .docx file
document = Document( 'TestFile.docx' )


# Search document for unique placeholder entries (must have a unique heading style)
for heading in iter_headings( document.paragraphs, 'Heading 2' ) :
    entryWorking.append( heading.text )


# Create list of randomized gamebook entry numbers
entryNumbers = [ i for i in range( len ( entryWorking ) + 1 ) ]

# Remove unnecessary entry zero (extra added above to compensate)
entryNumbers.remove( 0 )

# Convert to strings
entryNumbers = [ str( x ) for x in entryNumbers ]


# Identify pre-set entries (such as Entry 1), and remove from both lists
# This avoids pre-set numbers being replaced (i.e. they remain as is in the .docx)
# Pre-set entry numbers must _not_ have the "#" prefix in the .docx
for string in entryWorking :
    if string[ 0 ] != '#' :
        entryWorking.remove( string )
        if string in entryNumbers :
            entryNumbers.remove( string )

# Shuffle new entry numbers
random.shuffle( entryNumbers )


# Create tuple list of placeholder entries paired with random entry
reference = tuple( zip( entryWorking, entryNumbers ) )


# Replace placeholder headings with assigned randomized entry
for heading in iter_headings( document.paragraphs, 'Heading 2' ) :
    for entry in reference :
        if heading.text == entry[ 0 ] :
            heading.text = entry[ 1 ]


# Search through paragraphs for placeholders and replace with randomized entry
for paragraph in document.paragraphs :
    for run in paragraph.runs :
        for entry in reference :
            if run.text == entry[ 0 ] :
                run.text = entry [ 1 ]

                        
# Save the new document with final entries
document.save('Output.docx')

Bắt đầu với

paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')
4 là dễ dàng. Hãy để đi bộ qua những điều cơ bản.

Mở một tài liệu

Thêm một đoạn văn

from docx import Document

document = Document()

Thêm một tiêu đề

Thêm một đoạn văn

Thêm một tiêu đề

Thêm một trang phá vỡ trang

paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')

Thêm một bàn

Thêm một bức tranh

prior_paragraph = paragraph.insert_paragraph_before('Lorem ipsum')

Kích cỡ hình¶

Thêm một tiêu đề

Thêm một trang phá vỡ trang

document.add_heading('The REAL meaning of the universe')

Thêm một bàn

Thêm một bức tranh

Kích cỡ hình¶

Thêm một trang phá vỡ trang

Thêm một bàn

document.add_page_break()

Thêm một bức tranh

Thêm một bàn

Một người thường xuyên gặp nội dung cho vay để trình bày bảng, xếp thành các hàng và cột gọn gàng. Word làm một công việc khá tốt về điều này. Đây là cách để thêm một bảng:

table = document.add_table(rows=2, cols=2)

Các bảng có một số thuộc tính và phương thức mà bạn sẽ cần để điền vào chúng. Truy cập các ô riêng lẻ có lẽ là một nơi tốt để bắt đầu. Như một đường cơ sở, bạn luôn có thể truy cập một ô bằng các chỉ số hàng và cột của nó:

Điều này cung cấp cho bạn ô bên phải trong hàng trên cùng của bảng chúng tôi vừa tạo. Lưu ý rằng các chỉ số hàng và cột là dựa trên không, giống như trong quyền truy cập danh sách.

Một khi bạn có một ô, bạn có thể đặt một cái gì đó vào đó:

________số 8

Thường thì nó dễ dàng truy cập vào một hàng ô tại một thời điểm, ví dụ như khi điền vào một bảng độ dài thay đổi từ nguồn dữ liệu. Thuộc tính

paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')
7 của bảng cung cấp quyền truy cập vào các hàng riêng lẻ, mỗi hàng có thuộc tính
paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')
8. Thuộc tính
paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')
8 trên cả
prior_paragraph = paragraph.insert_paragraph_before('Lorem ipsum')
0 và
prior_paragraph = paragraph.insert_paragraph_before('Lorem ipsum')
1 hỗ trợ truy cập được lập chỉ mục, như một danh sách:

row = table.rows[1]
row.cells[0].text = 'Foo bar to you.'
row.cells[1].text = 'And a hearty foo bar to you too sir!'

Các bộ sưu tập

paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')
7 và
prior_paragraph = paragraph.insert_paragraph_before('Lorem ipsum')
3 trên bảng có thể sử dụng được, vì vậy bạn có thể sử dụng chúng trực tiếp trong vòng lặp
prior_paragraph = paragraph.insert_paragraph_before('Lorem ipsum')
4. Tương tự với các chuỗi
paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')
8 trên một hàng hoặc cột:

from docx import Document

document = Document()
0

Nếu bạn muốn số lượng các hàng hoặc cột trong bảng, chỉ cần sử dụng

prior_paragraph = paragraph.insert_paragraph_before('Lorem ipsum')
6 trên chuỗi:

from docx import Document

document = Document()
1

Bạn cũng có thể thêm hàng vào bảng tăng dần như vậy:

Điều này có thể rất tiện dụng cho kịch bản bảng chiều dài thay đổi mà chúng tôi đã đề cập ở trên:

from docx import Document

document = Document()
2

Các tác phẩm tương tự cho các cột, mặc dù tôi vẫn chưa thấy trường hợp sử dụng cho nó.

Word có một tập hợp các kiểu bảng được định dạng sẵn mà bạn có thể chọn từ bộ sưu tập kiểu bàn của nó. Bạn có thể áp dụng một trong những cái đó vào bảng như thế này:

from docx import Document

document = Document()
3

Tên kiểu được hình thành bằng cách xóa tất cả các không gian khỏi tên kiểu bảng. Bạn có thể tìm thấy tên kiểu bảng bằng cách di chuột qua hình thu nhỏ của nó trong bộ sưu tập kiểu bàn Word.

Thêm một bức tranh

Word cho phép bạn đặt một hình ảnh vào một tài liệu bằng mục menu

prior_paragraph = paragraph.insert_paragraph_before('Lorem ipsum')
7. Đây là cách làm điều đó trong
paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')
4:

from docx import Document

document = Document()
4

Ví dụ này sử dụng một đường dẫn, tải tệp hình ảnh từ hệ thống tập tin cục bộ. Bạn cũng có thể sử dụng một đối tượng giống như tệp, về cơ bản, bất kỳ đối tượng nào hoạt động giống như một tệp mở. Điều này có thể rất hữu ích nếu bạn lấy lại hình ảnh của mình từ cơ sở dữ liệu hoặc qua mạng và không muốn tham gia vào hệ thống tập tin.

Kích cỡ hình¶

Theo mặc định, hình ảnh được thêm vào xuất hiện ở kích thước gốc. Điều này thường lớn hơn bạn muốn. Kích thước gốc được tính là

prior_paragraph = paragraph.insert_paragraph_before('Lorem ipsum')
9. Vì vậy, hình ảnh 300x300 pixel có độ phân giải 300 dpi xuất hiện trong một hình vuông một inch. Vấn đề là hầu hết các hình ảnh don lồng chứa thuộc tính DPI và nó mặc định là 72 DPI. Điều này sẽ làm cho cùng một hình ảnh xuất hiện 4.167 inch ở một bên, ở đâu đó khoảng một nửa trang.

Để có được hình ảnh kích thước bạn muốn, bạn có thể chỉ định chiều rộng hoặc chiều cao của nó theo các đơn vị thuận tiện, như inch hoặc centimet:

from docx import Document

document = Document()
5

Bạn có thể tự do chỉ định cả chiều rộng và chiều cao, nhưng thông thường bạn sẽ không muốn. Nếu bạn chỉ định một,

paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')
4 sử dụng nó để tính giá trị được chia tỷ lệ đúng của cái kia. Bằng cách này, tỷ lệ khung hình được bảo tồn và hình ảnh của bạn không có vẻ kéo dài.

Các lớp

document.add_heading('The REAL meaning of the universe')
1 và
document.add_heading('The REAL meaning of the universe')
2 được cung cấp để cho phép bạn chỉ định các phép đo trong các đơn vị tiện dụng. Trong nội bộ,
paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')
4 sử dụng các đơn vị số liệu tiếng Anh, 914400 đến inch. Vì vậy, nếu bạn quên và chỉ cần đặt một cái gì đó như
document.add_heading('The REAL meaning of the universe')
4, bạn sẽ có được một hình ảnh cực kỳ nhỏ :). Bạn cần phải nhập chúng từ gói phụ
document.add_heading('The REAL meaning of the universe')
5. Bạn có thể sử dụng chúng trong số học giống như chúng là một số nguyên, trong thực tế chúng là. Vì vậy, một biểu thức như
document.add_heading('The REAL meaning of the universe')
6 hoạt động tốt.

Áp dụng một phong cách đoạn văn

Nếu bạn không biết phong cách đoạn văn là gì, bạn chắc chắn nên kiểm tra nó. Về cơ bản, nó cho phép bạn áp dụng cả một bộ tùy chọn định dạng cho một đoạn văn cùng một lúc. Nó rất giống với phong cách CSS nếu bạn biết đó là gì.

Bạn có thể áp dụng một kiểu đoạn văn ngay khi bạn tạo một đoạn văn:

from docx import Document

document = Document()
6

Phong cách đặc biệt này khiến đoạn văn xuất hiện như một viên đạn, một thứ rất tiện dụng. Bạn cũng có thể áp dụng một phong cách sau đó. Hai dòng này tương đương với dòng trên:

from docx import Document

document = Document()
7

Phong cách được chỉ định bằng cách sử dụng tên kiểu của nó, ‘Danh sách Bullet, trong ví dụ này. Nói chung, tên kiểu chính xác như nó xuất hiện trong giao diện người dùng từ (UI).

Áp dụng táo bạo và chữ viết

Để hiểu được công việc táo bạo và in nghiêng như thế nào, bạn cần hiểu một chút về những gì diễn ra trong một đoạn văn. Phiên bản ngắn là đây:

  1. Một đoạn văn chứa tất cả các định dạng cấp khối, như thụt lề, chiều cao dòng, các tab, v.v.
  2. Định dạng cấp độ ký tự, chẳng hạn như in đậm và in nghiêng, được áp dụng ở cấp độ chạy. Tất cả nội dung trong một đoạn phải trong một cuộc chạy, nhưng có thể có nhiều hơn một. Vì vậy, một đoạn văn với một từ đậm ở giữa sẽ cần ba lần chạy, một đoạn bình thường, một từ in đậm chứa từ này và một từ bình thường khác cho văn bản sau đó.

Khi bạn thêm một đoạn văn bằng cách cung cấp văn bản cho phương thức

document.add_heading('The REAL meaning of the universe')
7, nó sẽ được đưa vào một lần chạy. Bạn có thể thêm nhiều hơn bằng cách sử dụng phương thức
document.add_heading('The REAL meaning of the universe')
8 trên đoạn văn:

from docx import Document

document = Document()
8

Điều này tạo ra một đoạn văn trông giống như một đoạn được tạo từ một chuỗi. Nó không rõ ràng nơi văn bản đoạn văn bị chia thành chạy trừ khi bạn nhìn vào XML. Lưu ý không gian dấu vết ở cuối chuỗi đầu tiên. Bạn cần phải rõ ràng về nơi không gian xuất hiện ở đầu và cuối của một lần chạy. Họ không tự động chèn vào giữa các lần chạy. Mong đợi sẽ bị bắt bởi một vài lần :).

Các đối tượng

document.add_heading('The REAL meaning of the universe')
9 có cả thuộc tính
document.add_heading('The role of dolphins', level=2)
0 và
document.add_heading('The role of dolphins', level=2)
1 cho phép bạn đặt giá trị của chúng để chạy:

from docx import Document

document = Document()
9

trong đó tạo ra văn bản trông như thế này: ‘Lorem ipsum dor ngồi ampe.dolor sit amet.’

Lưu ý rằng bạn có thể đặt in đậm hoặc in nghiêng về kết quả của

document.add_heading('The REAL meaning of the universe')
8 nếu bạn không cần nó cho bất cứ điều gì khác:

paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')
0

Nó không cần thiết để cung cấp văn bản cho phương thức

document.add_heading('The REAL meaning of the universe')
7. Điều này có thể làm cho mã của bạn đơn giản hơn nếu bạn đang xây dựng đoạn văn từ các lần chạy bằng mọi cách:

paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')
1

Áp dụng một phong cách nhân vật

Ngoài các kiểu đoạn văn, chỉ định một nhóm cài đặt cấp đoạn, Word có các kiểu ký tự chỉ định một nhóm cài đặt cấp độ chạy. Nói chung, bạn có thể nghĩ về một kiểu nhân vật là chỉ định một phông chữ, bao gồm kiểu chữ, kích thước, màu sắc, màu đậm, in nghiêng, v.v.

Giống như các kiểu đoạn văn, một kiểu nhân vật phải được xác định trong tài liệu bạn mở với cuộc gọi

document.add_heading('The role of dolphins', level=2)
4 (xem các kiểu hiểu).Understanding Styles).

Một kiểu ký tự có thể được chỉ định khi thêm một lần chạy mới:

paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')
2

Bạn cũng có thể áp dụng một kiểu để chạy sau khi nó được tạo. Mã này tạo ra kết quả tương tự như các dòng trên:

paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')
3

Như với một kiểu đoạn văn, tên kiểu là như nó xuất hiện trong từ UI.