2010-03-03 31 views
14

Ví dụ, chúng tôi có một số tập tin như thế:Làm thế nào để xóa tất cả các dòng trống trong tập tin với sự giúp đỡ của python?

dòng đầu tiên
dòng thứ hai

dòng thứ ba

Và trong kết quả chúng ta phải nhận được:

dòng đầu tiên
dòng thứ hai
dòng thứ ba

CHỈ sử dụng python

+5

Chia sẻ ý tưởng và nỗ lực của bạn. Chúng tôi sẽ cố gắng giúp bạn. –

+3

Nó thực sự tầm thường với grep, ví dụ. 'grep -v '^ $' file' –

+1

Nó sẽ làm việc cả dưới win và linux, vì vậy chúng ta có thể sử dụng chỉ python, không grep =) – user285070

Trả lời

22
import fileinput 
for line in fileinput.FileInput("file",inplace=1): 
    if line.rstrip(): 
     print line 
+1

+1 để bắt các dòng có khoảng trắng và không có gì khác. –

+2

Điều này sẽ thay đổi để định dạng khoảng trắng ngay cả trong các dòng tốt –

+1

không hiểu, giống như định dạng nào? cẩn thận để xây dựng? – ghostdog74

1
>>> s = """first line 
... second line 
... 
... third line 
... """ 
>>> print '\n'.join([i for i in s.split('\n') if len(i) > 0]) 
first line 
second line 
third line 
>>> 
+0

Nó phụ thuộc vào những gì "trống" có nghĩa là - điều này chỉ hoạt động nếu trống có nghĩa là "không có gì cả". Nếu có không gian giữa dòng thứ hai và dòng thứ ba, điều này sẽ thất bại. Cộng với nó cần phải làm việc trên các tập tin :) Nhưng tôi thích rằng bạn không phải nhập khẩu regexps :) – Chirael

+0

@Chirael - cho trường hợp đó bạn có thể thêm chỉ len (i.strip())> 0 –

4

Tôi biết bạn hỏi về Python, nhưng nhận xét của bạn về Win và Linux chỉ ra rằng bạn đang sau cross-platform-Ness, và Perl ít nhất là nền tảng chéo như Python. Bạn có thể làm điều này dễ dàng với một dòng Perl trên dòng lệnh, không cần tập lệnh nào: perl -ne 'print if /\S/' foo.txt

(Tôi yêu Python và thích nó hơn Perl 99% thời gian, nhưng đôi khi tôi thực sự muốn tôi có thể làm dòng lệnh) các kịch bản với nó như bạn có thể với chuyển đổi -e thành Perl!)

Điều đó nói rằng, tập lệnh Python sau đây sẽ hoạt động. Nếu bạn mong muốn thực hiện điều này thường xuyên hoặc cho các tệp lớn, nó cũng cần được tối ưu hóa bằng cách biên dịch các cụm từ thông dụng.

#!/usr/bin/python 
import re 
file = open('foo.txt', 'r') 
for line in file.readlines(): 
    if re.search('\S', line): print line, 
file.close() 

Có rất nhiều cách để làm điều này, đó chỉ là một :)

+2

Bạn có thể thực hiện các tập lệnh dòng lệnh bằng python bằng cờ '-c'. Thật không may bạn sẽ phải sử dụng nhiều dòng (hoặc tách với;) để đọc từ đầu vào tiêu chuẩn. –

20

Tuyên bố with là tuyệt vời cho tự động mở và đóng file.

with open('myfile','rw') as file: 
    for line in file: 
     if not line.isspace(): 
      file.write(line) 
+4

+1 để sử dụng "với" và lặp đi lặp lại tốt, pythonic thông qua các dòng, ngoài việc không làm thay đổi dòng đầu ra tốt. –

+2

Dường như bạn phải mở tệp tin của tôi bằng cờ 'r +' thay vì 'rw' theo https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files – furins

+2

Giải pháp này dường như như nó sẽ có đệm/ghi đè lên các vấn đề cho bất kỳ tệp nào lớn hơn kích thước bộ đệm đầu vào. Và nếu không, ai đó có thể giải thích tại sao? –

7
import sys 
with open("file.txt") as f: 
    for line in f: 
     if not line.isspace(): 
      sys.stdout.write(line) 

Một cách khác là

with open("file.txt") as f: 
    print "".join(line for line in f if not line.isspace()) 
0

Bạn đã thử một cái gì đó giống như chương trình dưới đây?

for line in open(filename): 
    if len(line) > 1 or line != '\n': 
     print(line, end='') 
0

Bạn có thể sử dụng dưới đây cách để xóa tất cả các dòng trống:

with open("new_file","r") as f: 
for i in f.readlines(): 
     if not i.strip(): 
      continue 
     if i: 
      print i, 

Chúng tôi cũng có thể viết ra để nộp sử dụng dưới đây cách:

with open("new_file","r") as f, open("outfile.txt","w") as outfile: 
for i in f.readlines(): 
     if not i.strip(): 
      continue 
     if i: 
      outfile.write(i)    
Các vấn đề liên quan