2010-03-30 53 views
9

Tôi có tài liệu văn bản chứa danh sách các số và tôi muốn chuyển đổi nó thành danh sách. Ngay bây giờ tôi chỉ có thể lấy toàn bộ danh sách trong mục 0 của danh sách, nhưng tôi muốn mỗi số là một phần tử của một danh sách. Có ai biết một cách dễ dàng để làm điều này trong Python?Chuyển đổi chuỗi thành danh sách bằng Python

1000 
2000 
3000 
4000 

để

['1000','2000','3000','4000'] 
+3

Bạn có thực sự muốn '[ '1000', '2000', '3000', '4000']'? Có lẽ '[1000,2000,3000,4000]' sẽ tốt hơn? –

+0

Câu hỏi của bạn thừa nhận có quá nhiều khả năng. Tệp văn bản chỉ chứa danh sách các số hay danh sách đó trong ngữ cảnh lớn hơn. Bạn có thể kiểm soát cách bạn đọc từ tài liệu hoặc bạn đang mắc kẹt với việc đọc một chuỗi có chứa một loạt các số dòng cách nhau hoặc khoảng trống được phân tách không? Các số trong danh sách có luôn được phân cách bằng dòng mới hay đôi khi chúng được phân tách bằng khoảng trắng khác? Bạn có thực sự muốn một danh sách các chuỗi như là kết quả của bạn, hoặc sẽ một danh sách các số nguyên được tốt hơn? – Omnifarious

Trả lời

20

Để chuyển đổi một chuỗi Python vào một danh sách sử dụng phương pháp str.split:

>>> '1000 2000 3000 4000'.split() 
['1000', '2000', '3000', '4000'] 

split có một số lựa chọn: tìm họ cho sử dụng tiên tiến.

Bạn cũng có thể đọc tệp trong danh sách với phương thức readlines() của đối tượng tệp - nó trả về danh sách các dòng. Ví dụ, để có được một danh sách các số nguyên từ tập tin đó, bạn có thể làm:

lst = map(int, open('filename.txt').readlines()) 

Tái bút: Xem một số phương pháp khác để thực hiện điều tương tự trong các ý kiến. Một số trong những phương pháp đó đẹp hơn (nhiều hơn Pythonic) so với tôi

+1

bạn đang sử dụng 'str.split', không phải' string.split', sau này là lỗi thời. – SilentGhost

+0

@SilentGhost: typo cố định, cảm ơn vì đã chú ý –

+2

Các đối tượng tệp có thể lặp lại, vì vậy ít khi có lý do để sử dụng phương thức 'readlines'. Ví dụ, bạn có thể nhận được kết quả tương tự như đoạn cuối cùng của bạn với 'map (int, open ('filename.txt'))'. –

1
>>> open("myfile.txt").readlines() 
>>> lines = open("myfile.txt").readlines() 
>>> lines 
['1000\n', '2000\n', '3000\n', '4000\n'] 
>>> clean_lines = [x.strip() for x in lines] 
>>> clean_lines 
['1000', '2000', '3000', '4000'] 

Hoặc, nếu bạn có một chuỗi đã có, sử dụng str.split:

>>> myfile 
'1000\n2000\n3000\n4000\n' 
>>> myfile.splitlines() 
['1000', '2000', '3000', '4000', ''] 

Bạn có thể loại bỏ các phần tử rỗng với một sự hiểu biết danh sách (hoặc chỉ cần một vòng lặp for thông thường)

>>> [x for x in myfile.splitlines() if x != ""] 
['1000', '2000', '3000', '4000'] 
+1

sử dụng 's.splitlines()', không phải 's.split (" \ n ")' –

0

Bạn có thể cần phải bỏ qua các dòng mới.

# list of strings 
[number for number in open("file.txt")] 

# list of integers 
[int(number) for number in open("file.txt")] 
+0

Và, nếu OP cần phải tách các dòng mới, mã đó sẽ trông như thế nào? – Omnifarious

+0

Bạn cũng có thể chỉ sử dụng 'list' builtin thay vì danh sách hiểu -' list (open ("myfile.txt")) '->' ['1000 \ n', '2000 \ n', '3000 \ n ',' 4000 \ n '] ' – dbr

+0

@dbr:' .readlines() 'có thể là một lựa chọn tốt hơn. – SilentGhost

1
$ cat > t.txt 
    1 
    2 
    3 
    4 
    ^D 
    $ python 
    Python 2.6.1 (r261:67515, Jul 7 2009, 23:51:51) 
    [GCC 4.2.1 (Apple Inc. build 5646)] on darwin 
    Type "help", "copyright", "credits" or "license" for more information. 
    >>> l = [l.strip() for l in open('t.txt')] 
    >>> l 
    ['1', '2', '3', '4'] 
    >>> 
+1

bạn không cần phải làm' .readlines() '! – SilentGhost

+0

đúng. đã xóa ngay bây giờ, cảm ơn vì đã chỉ ra điều đó! – rytis

1
with open('file.txt', 'rb') as f: 
     data = f.read() 
    lines = [s.strip() for s in data.split('\n') if s] 
Các vấn đề liên quan