2013-08-26 24 views
10

Tôi là người dùng Python mới.Nhập tệp txt và có mỗi dòng dưới dạng danh sách

Tôi có một file txt đó sẽ là một cái gì đó như:

3,1,3,2,3 
3,2,2,3,2 
2,1,3,3,2,2 
1,2,2,3,3,1 
3,2,1,2,2,3 

nhưng có thể ít hoặc nhiều dòng.

Tôi muốn nhập mỗi dòng dưới dạng danh sách.

Tôi biết bạn có thể làm điều đó như thế:

filename = 'MyFile.txt' 
fin=open(filename,'r') 
L1list = fin.readline() 
L2list = fin.readline() 
L3list = fin.readline() 

nhưng kể từ khi tôi không biết có bao nhiêu dòng tôi sẽ có, là có một cách khác để tạo danh sách cá nhân?

Trả lời

22

Không tạo danh sách riêng; tạo ra một danh sách liệt kê:

results = [] 
with open('inputfile.txt') as inputfile: 
    for line in inputfile: 
     results.append(line.strip().split(',')) 

hay vẫn tốt hơn, sử dụng csv module:

import csv 

results = [] 
with open('inputfile.txt', newline='') as inputfile: 
    for row in csv.reader(inputfile): 
     results.append(row) 

Lists hay từ điển là xa cấu trúc superiour để theo dõi một số tùy ý điều đọc từ một tập tin .

Lưu ý rằng một trong hai vòng lặp cũng cho phép bạn xử lý các hàng dữ liệu riêng lẻ mà không phải đọc tất cả nội dung của tệp vào bộ nhớ; thay vì sử dụng results.append(), hãy xử lý dòng đó ngay tại đó.

Chỉ cần cho đầy đủ vì lợi ích, đây là một trong những-liner nhỏ gọn phiên bản để đọc trong một tập tin CSV vào một danh sách trong một đi:

import csv 

with open('inputfile.txt', newline='') as inputfile: 
    results = list(csv.reader(inputfile)) 
+0

'csv.reader (mở (tên tệp))' dễ dàng! –

4

Tạo một danh sách liệt kê:

with open("/path/to/file") as file: 
    lines = [] 
    for line in file: 
     # The rstrip method gets rid of the "\n" at the end of each line 
     lines.append(line.rstrip().split(",")) 
+0

Tuyệt vời, cảm ơn rất nhiều, điều đó có ý nghĩa rất nhiều. – John

+0

Hi iCodez- Tôi thực sự đang cố gắng sử dụng điều này và trong khi đang tạo danh sách các danh sách, danh sách thực sự chỉ có một mục trong đó - tệp đầu vào mà tôi đang sử dụng ngay bây giờ (như được tham chiếu trong câu hỏi gốc) có ba dòng, do đó, cần có ba danh sách. Sử dụng cách tiếp cận của bạn, tôi chỉ nhận được [['' '', '2', '1', '2', '3', '1', '2', '3', '1', '2', '3', '1 \ r1', '1', '1', '1', '3', '3', '1', '1', '2', '2', '1', '3']]. Có suy nghĩ gì không? Cám ơn rất nhiều. – John

+0

@ John - Tôi không thể tái tạo sự cố của bạn. Tôi đã thử nghiệm mã của tôi trên ví dụ 5 dòng bạn đã cung cấp và nó hoạt động giống như nó phải có. Nó tạo ra một danh sách 5 danh sách, một danh sách cho mỗi dòng. Bạn có chắc tệp có 3 dòng chứ không chỉ một dòng dài? – iCodez

2
with open('path/to/file') as infile: # try open('...', 'rb') as well 
    answer = [line.strip().split(',') for line in infile] 

Nếu bạn muốn các số như int s:

with open('path/to/file') as infile: 
    answer = [[int(i) for i in line.strip().split(',')] for line in infile] 
+0

Cảm ơn!Một theo dõi câu hỏi-0 Tôi nhận được lỗi File "seventeen_v2.3.py", dòng 7, trong answer = [[int (i) cho i trong dòng.strip(). Split (',') ] cho dòng trong infile] ValueError: không hợp lệ chữ cho int() với cơ sở 10: '1 \ r1' Tệp txt chỉ có chữ số trong nó- bất kỳ ý tưởng tại sao python đang thêm "\ r1" này vào đầu vào? – John

+0

Kiểm tra chỉnh sửa – inspectorG4dget

-1
lines=[] 
with open('file') as file: 
    lines.append(file.readline()) 
+1

Bạn sẽ cần cung cấp câu trả lời hoàn chỉnh hơn. Vì nó hiện đang đứng, điều này không làm những gì OP muốn. – iCodez

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