Phương pháp tốt nhất để đọc các tệp được phân tách bằng dòng mới và loại bỏ các dòng mới?


84

Tôi đang cố gắng xác định cách tốt nhất để xử lý việc loại bỏ dòng mới khi đọc trong các tệp được phân tách bằng dòng mới bằng Python.

Những gì tôi nghĩ ra là đoạn mã sau đây, bao gồm mã nguồn để kiểm tra.

import os

def getfile(filename,results):
   f = open(filename)
   filecontents = f.readlines()
   for line in filecontents:
     foo = line.strip('\n')
     results.append(foo)
   return results

blahblah = []

getfile('/tmp/foo',blahblah)

for x in blahblah:
    print x

Gợi ý?


sử dụng split ("/ n") thì sao?
jle


Tôi nghĩ rằng nó sẽ được tốt hơn để đóng tập tin cũng
Paweł Prażak

Câu trả lời:


196
lines = open(filename).read().splitlines()

Câu trả lời này phù hợp với những gì tôi đã định, tôi chắc chắn rằng tôi sẽ cần thêm một số kiểm tra lỗi và tương tự, nhưng đối với nhu cầu cụ thể này, nó thật tuyệt. Cảm ơn tất cả các bạn đã cung cấp câu trả lời!
Solarce

Tôi thích điều này nhưng làm cách nào để đóng tệp nếu bạn không lưu khỏi tệp xử lý? Hay là nó tự động đóng lại?
IJ Kennedy

6
Với CPython, số lượng tham chiếu cho đối tượng tệp sẽ bằng 0 khi nó không còn được sử dụng và tệp sẽ tự động bị đóng. Đối với các triển khai thuần túy GC như Jython và IronPython, tệp có thể không được đóng cho đến khi GC chạy - vì vậy biến thể ngắn gọn này có thể không tối ưu.
Curt Hagenlocher

2
Trên Mac OS X 10.7.5 với 8GB RAM, tôi có thể đọc tệp có dung lượng lên đến 2047MB (định nghĩa của tôi: 1 MB = 1024 x 1024 byte). 2048MB sẽ ném ngoại lệ MemoryError.
Hai Vu

1
@WKPlus Câu hỏi tuyệt vời - câu trả lời là "nó phụ thuộc" stackoverflow.com/a/15099341/994153 (CPython sẽ đóng nó vì số lượng tham chiếu giảm xuống 0, nhưng các triển khai Python khác có thể không đóng nó, vì vậy tốt nhất hãy làm cho nó rõ ràng )
Colin D Bennett

23

Đây là một máy phát điện thực hiện những gì bạn yêu cầu. Trong trường hợp này, sử dụng rstrip là đủ và nhanh hơn một chút so với dải.

lines = (line.rstrip('\n') for line in open(filename))

Tuy nhiên, rất có thể bạn sẽ muốn sử dụng điều này để loại bỏ các khoảng trắng theo sau.

lines = (line.rstrip() for line in open(filename))

Không nên [] xung quanh RHS, không phải ()?
andrewb

8
@andrewb Sử dụng () đưa ra một biểu hiện máy phát điện, mà không sử dụng như là bộ nhớ nhiều như sử dụng [] (danh sách hiểu.)
Jonathan Hartley

9

Bạn nghĩ gì về cách tiếp cận này?

with open(filename) as data:
    datalines = (line.rstrip('\r\n') for line in data)
    for line in datalines:
        ...do something awesome...

Biểu thức trình tạo tránh tải toàn bộ tệp vào bộ nhớ và withđảm bảo đóng tệp


Về cơ bản, câu trả lời này giống với câu trả lời của @ TimoLinna được đăng trước đó nhiều năm ...
martineau


4

Chỉ cần sử dụng biểu thức trình tạo:

blahblah = (l.rstrip() for l in open(filename))
for x in blahblah:
    print x

Ngoài ra, tôi muốn khuyên bạn không nên đọc toàn bộ tệp trong bộ nhớ - lặp qua trình tạo sẽ hiệu quả hơn nhiều trên các bộ dữ liệu lớn.


3

Tôi sử dụng cái này

def cleaned( aFile ):
    for line in aFile:
        yield line.strip()

Sau đó, tôi có thể làm những việc như thế này.

lines = list( cleaned( open("file","r") ) )

Hoặc, tôi có thể mở rộng làm sạch với các chức năng bổ sung, chẳng hạn như bỏ dòng trống hoặc bỏ qua dòng nhận xét hoặc bất cứ điều gì.


2

Tôi sẽ làm như thế này:

f = open('test.txt')
l = [l for l in f.readlines() if l.strip()]
f.close()
print l

Mặc dù câu trả lời của Curt Hagenlocher về mặt kỹ thuật tốt hơn, nhưng câu trả lời này là một điểm khởi đầu tốt nếu bạn cần thêm quá trình xử lý khác cho mỗi dòng.
TomOnTime

Không chắc liệu nó có nhằm mục đích lọc các dòng trống hay không, nhưng điều này ngắn gọn hơn ... if l.strip() is not '', đó là những gì tôi cần trong trường hợp của mình.
Zach Young
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.