2009-05-17 10 views
23

Tôi có một tệp văn bản đơn giản với hàng nghìn từ, mỗi từ trong dòng riêng của nó, ví dụ:Python: tải các từ từ tệp vào một tập hợp

aardvark 
hello 
piper 

tôi sử dụng đoạn mã sau để tải những lời thành một tập (Tôi cần danh sách các từ để kiểm tra thành viên, vì vậy thiết lập được cấu trúc dữ liệu tôi đã chọn):

my_set = set(open('filename.txt')) 

Đoạn mã trên tạo ra một thiết lập với các mục sau (mỗi từ được theo sau bởi một dấu cách và xuống dòng nhân vật:

("aardvark \n", "hello \n", "piper \n") 

gì là cách đơn giản nhất để tải các tập tin vào một tập nhưng thoát khỏi không gian và \ n

Cảm ơn

Trả lời

38

Phương pháp dải() của chuỗi loại bỏ khoảng trắng từ cả hai đầu.

set(line.strip() for line in open('filename.txt')) 
+4

Đây là giải pháp tốt nhất nếu bạn có tệp lớn, vì bản đồ sẽ tải toàn bộ tệp vào bộ nhớ như một danh sách các dòng, mà sau đó sẽ được loại bỏ (itertools.imap có thể khắc phục điều đó, mặc dù). –

+1

@Ryan: điều đó đúng với Python <= 2.6, nhưng trong bản đồ 3.0 trả về một trình tạo. – Stephan202

+0

@RyanGinstrom Xin lỗi vì đã đến trễ, nhưng tôi không thể không hỏi câu hỏi này cho bạn! Tôi đã quan sát thấy rằng 'print'' my_set [0] 'vẫn in 'aardvark'. Nó có di chuyển con trỏ tới dòng tiếp theo sau khi in không? Vui lòng sửa tôi nếu tôi nhầm, nhưng điều này xảy ra như thế nào? (Python 27) Cảm ơn! –

4
my_set = set(map(str.strip, open('filename.txt'))) 
+0

Giải pháp này sẽ loại bỏ đúng các dấu cách và ký tự dòng mới bằng cách áp dụng phương thức str.strip cho mỗi dòng filename.txt – Wesley

1

Để chỉ xóa các khoảng trống bên phải.

set(map(str.rstrip, open('filename.txt'))) 
+0

Nếu kích thước tệp là khá lớn, phương pháp này sẽ có khả năng nhanh hơn. Nó tránh so sánh thêm với isspace() ở bên trái của mỗi chuỗi. –

+0

Có, tác giả chỉ chỉ định các khoảng trống ở phía bên phải, do đó, nó có ý nghĩa để làm rstrip thay vì dải hoặc chia nhỏ. – Unknown

12

Chỉ cần tải tất cả dữ liệu tập tin và chia nó, nó sẽ chăm sóc của một từ trên mỗi dòng hoặc nhiều từ trên mỗi dòng cách nhau bởi khoảng trắng, cũng có thể nó sẽ nhanh hơn để tải toàn bộ tập tin cùng một lúc trừ khi tập tin bạn đang ở trong GBs

words = set(open('filename.txt').read().split()) 
+0

Vì vậy, điều này sẽ làm việc nếu tôi có một từ trên mỗi dòng và cũng có thể nếu tôi có nhiều từ trên mỗi dòng? (giả sử nếu tôi có một dòng như "chào tạm biệt", tôi muốn "chào" và "tạm biệt" là hai từ riêng biệt trong tập hợp) –

+0

có nó về cơ bản sẽ chia thành không gian, các tab dòng mới vv để bạn có thể có tất cả các từ trong dòng đơn hoặc trong nhiều dòng hoặc hỗn hợp –

+0

và đừng lo lắng tải toàn bộ tệp trong bộ nhớ trừ khi bạn có tệp rất lớn mà tôi nghi ngờ vài MBs là hoàn hảo và điều này sẽ nhanh nhất –

0
with open("filename.txt") as f: 
    mySet = map(str.rstrip, f) 

Nếu bạn muốn sử dụng này bằng Python 2.5, bạn cần

from __future__ import with_statement 
+0

Tôi nghĩ rằng ở đây bạn có cú pháp lỗi: bộ (bản đồ (str.rstrip ('\ n') str, f) – mtasic85

+0

Cảm ơn vì đã bắt được, tôi đã sửa nó. –

1
with open("filename.txt") as f: 
    s = set([line.rstrip('\n') for line in f]) 
+0

bạn không cần danh sách hiểu ở đó – SilentGhost