2013-05-07 25 views
21

Trong dự án của tôi, tôi có một chuỗi các chuỗi được đọc từ một tệp. Hầu hết trong số họ, khi được in trong bảng điều khiển lệnh, vượt quá 80 ký tự và quấn quanh, trông xấu xí.Một cách hay để tạo chuỗi dài bọc cho dòng mới bằng Python?

Tôi muốn có thể đọc Python chuỗi, sau đó kiểm tra xem nó có dài hơn 75 ký tự hay không. Nếu có, sau đó chia chuỗi thành nhiều chuỗi, sau đó in chuỗi sau chuỗi khác trên dòng mới. Tôi cũng muốn nó thông minh, không cắt bỏ những từ đầy đủ. tức là "The quick brown <newline> fox..." thay vì "the quick bro<newline>wn fox...".

Tôi đã thử sửa đổi mã tương tự cắt ngắn chuỗi sau một độ dài đã đặt, nhưng chỉ cắt xén chuỗi thay vì đặt nó vào một dòng mới.

Một số phương pháp tôi có thể sử dụng để thực hiện việc này là gì?

+1

[textwrap] (http: //docs.python .org/3/library/textwrap.html) là điều tuyệt vời cho việc này, nhưng nó phụ thuộc vào định dạng tệp của bạn! Là tập tin một chuỗi các chuỗi với nhau, hoặc là chúng trên các dòng riêng biệt, bởi vì trên các dòng riêng biệt, khi bạn sử dụng 'textwrap' nó rất có thể sẽ giành được –

+0

@ Ryan-Saxe đó là một tệp văn bản với mỗi chuỗi được phân tách bằng ký tự đặt (một ống, |). textwrap âm thanh như nó sẽ làm việc, sau đó! –

Trả lời

41

Bạn có thể sử dụng mô-đun textwrap:

>>> import textwrap 
>>> strs = "In my project, I have a bunch of strings that are read in from a file. Most of them, when printed in the command console, exceed 80 characters in length and wrap around, looking ugly." 
>>> print(textwrap.fill(strs, 20)) 
In my project, I 
have a bunch of 
strings that are 
read in from a file. 
Most of them, when 
printed in the 
command console, 
exceed 80 characters 
in length and wrap 
around, looking 
ugly. 

giúp đỡ trên textwrap.fill:

>>> textwrap.fill? 

Definition: textwrap.fill(text, width=70, **kwargs) 
Docstring: 
Fill a single paragraph of text, returning a new string. 

Reformat the single paragraph in 'text' to fit in lines of no more 
than 'width' columns, and return a new string containing the entire 
wrapped paragraph. As with wrap(), tabs are expanded and other 
whitespace characters converted to space. See TextWrapper class for 
available keyword args to customize wrapping behaviour. 

Sử dụng regex nếu bạn không muốn kết hợp một dòng vào dòng khác:

import re 


strs = """In my project, I have a bunch of strings that are. 
Read in from a file. 
Most of them, when printed in the command console, exceed 80. 
Characters in length and wrap around, looking ugly.""" 

print('\n'.join(line.strip() for line in re.findall(r'.{1,40}(?:\s+|$)', strs))) 

# Reading a single line at once: 
for x in strs.splitlines(): 
    print '\n'.join(line.strip() for line in re.findall(r'.{1,40}(?:\s+|$)', x)) 

đầu ra:

In my project, I have a bunch of strings 
that are. 
Read in from a file. 
Most of them, when printed in the 
command console, exceed 80. 
Characters in length and wrap around, 
looking ugly. 
+0

@ Ryan-Saxe. Đây chỉ là tại chỗ logic, nhưng làm thế nào về việc đặt một ký tự đầu cuối ở cuối mỗi dòng, đọc từng chuỗi vào một danh sách, sau đó làm textwrap trên mỗi chỉ mục danh sách? Có thể cần phải có một số hình thức của nhân vật tước sau này, nhưng có vẻ như ti sẽ làm việc. Thử nghiệm ngay bây giờ. –

+1

@JoshuaMerriman không hoạt động vì nếu một dòng có 90 ký tự, dòng tiếp theo sẽ có 10 –

+0

@RyanSaxe - những gì tôi đã thực hiện trong dự án của mình, có thể hoạt động cho những người khác, là tôi đã đọc từng dòng một mảng, sau đó đặt các biến cho các giá trị của các mảng đó. do đó, nó không quan trọng nếu các chuỗi nằm trên các dòng mới trong tệp nguồn - chúng sẽ nằm trong biến riêng của chúng trong chương trình. –

7

Đây là những gì các module textwrap là cho. Hãy thử textwrap.fill(some_string, width=75).

2

này cũng tương tự như câu trả lời Ashwini nhưng không sử dụng re:

lim=75 
for s in input_string.split("\n"): 
    if s == "": print 
    w=0 
    l = [] 
    for d in s.split(): 
     if w + len(d) + 1 <= lim: 
      l.append(d) 
      w += len(d) + 1 
     else: 
      print " ".join(l) 
      l = [d] 
      w = len(d) 
    if (len(l)): print " ".join(l) 

Output khi đầu vào là câu hỏi của bạn:

In my project, I have a bunch of strings that are read in from a file. 
Most of them, when printed in the command console, exceed 80 characters in 
length and wrap around, looking ugly. 

I want to be able to have Python read the string, then test if it is over 
75 characters in length. If it is, then split the string up into multiple 
strings, then print one after the other on a new line. I also want it to be 
smart, not cutting off full words. i.e. "The quick brown <newline> fox..." 
instead of "the quick bro<newline>wn fox...". 
+0

Cảm ơn câu trả lời, nhưng thẳng thắn tôi nghĩ rằng sử dụng 'textwrap' là một phương pháp quản lý gói văn bản tốt hơn và dễ dàng hơn nhiều.nói rằng, nó sẽ là tốt cho những người muốn linh hoạt hơn trong dòng gói của họ, hoặc muốn hiểu được logic đằng sau textwrapping để phát triển các mô-đun riêng của họ! –

+1

@JoshuaMerriman Có nhưng điều đó không có nghĩa là bạn phải đưa ra câu trả lời được chấp nhận này. Chấp nhận câu trả lời đã giúp ** bạn **, bạn chính xác câu trả lời này sẽ giúp những người muốn tự mình thực hiện giải pháp này nhưng điều đó không có nghĩa là chúng ta nên thúc đẩy phát minh lại bánh xe. Đây không phải là một lý do chính đáng để không chấp nhận câu trả lời mà bạn thực sự sử dụng. – jamylak

+0

Rất tiếc, tôi có chấp nhận câu trả lời cuối cùng không? Tôi đã có ấn tượng rằng tôi có thể chấp nhận nhiều câu trả lời. Tôi đã sai, mặc dù. Rất tiếc! –

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