2009-07-22 29 views
10

Khi sử dụng thư viện textwrap Python, làm thế nào tôi có thể tắt chức năng này:Thư viện Python textwrap - Làm thế nào để bảo tồn các ngắt dòng?

short line, 

long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

vào đây:

short line, 

long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxxxxxx 

tôi đã cố gắng:

w = textwrap.TextWrapper(width=90,break_long_words=False) 
body = '\n'.join(w.wrap(body)) 

Nhưng tôi nhận được:

short line, long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

(khoảng cách không chính xác trong các ví dụ của tôi)

Trả lời

13

thử

w = textwrap.TextWrapper(width=90,break_long_words=False,replace_whitespace=False) 

dường như để sửa chữa các vấn đề đối với tôi

tôi làm việc đó ra từ những gì tôi đọc here (Tôi chưa bao giờ sử dụng textwrap trước)

+3

Ghi chú rằng trong trường hợp này trình bao bọc xem xét \ n là ký tự và không phải là trình ngắt dòng, ví dụ: nó sẽ giả định rằng \ npublished trước đó là một từ. Điều này gây ra vấn đề định dạng trong nhiều trường hợp. Vì vậy, giải pháp với "\ n" .join(), được đưa ra bởi người dùng "xa" là tốt hơn. – Zulko

3

Làm cách nào để chỉ quấn các dòng dài hơn 90 ký tự?

new_body = "" 
lines = body.split("\n") 

for line in lines: 
    if len(line) > 90: 
     w = textwrap.TextWrapper(width=90, break_long_words=False) 
     line = '\n'.join(w.wrap(line)) 

    new_body += line + "\n" 
0
lines = text.split("\n") 
lists = (textwrap.TextWrapper(width=90,break_long_words=False).wrap(line) for line in lines) 
body = "\n".join("\n".join(list) for list in lists) 
8
body = '\n'.join(['\n'.join(textwrap.wrap(line, 90, 
       break_long_words=False, replace_whitespace=False)) 
       for line in body.splitlines() if line.strip() != '']) 
0

tôi phải một vấn đề tương tự định dạng docstrings tạo động. Tôi muốn giữ lại các dòng mới được đặt bằng tay chia nhỏ mọi dòng trên một độ dài nhất định. Làm lại câu trả lời bằng @far một chút, giải pháp này làm việc cho tôi. Tôi chỉ bao gồm nó ở đây cho hậu thế:

import textwrap 

wrapArgs = {'width': 90, 'break_long_words': True, 'replace_whitespace': False} 
fold = lambda line, wrapArgs: textwrap.fill(line, **wrapArgs) 
body = '\n'.join([fold(line, wrapArgs) for line in body.splitlines()]) 
0

TextWrapper không được thiết kế để xử lý văn bản đã có dòng mới trong đó.

Có một hai điều bạn có thể muốn làm gì khi tài liệu của bạn đã có dòng mới:

1) Giữ dòng mới cũ, và chỉ quấn dây chuyền dài hơn giới hạn.

Bạn có thể phân lớp TextWrapper như sau:

class DocumentWrapper(textwrap.TextWrapper): 

    def wrap(self, text): 
     split_text = text.split('\n') 
     lines = [line for para in split_text for line in textwrap.TextWrapper.wrap(self, para)] 
     return lines 

Sau đó sử dụng nó theo cách tương tự như textwrap:

d = DocumentWrapper(width=90) 
wrapped_str = d.fill(original_str) 

Cung cấp cho bạn:

short line, 
long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxxxxxxxxxxxxxx 

2) Tháo các dòng mới cũ và bọc mọi thứ.

original_str.replace('\n', '') 
wrapped_str = textwrap.fill(original_str, width=90) 

Cung cấp cho bạn

short line, long line xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

(TextWrapper viết không giống nhau trong số này - nó chỉ bỏ qua các dòng mới hiện có, dẫn đến một kết quả thật là thú vị được định dạng)

Các vấn đề liên quan