2013-09-24 118 views
5

Giả sử tôi có tệp .txt với nhiều hàng và cột dữ liệu và danh sách chứa các giá trị số nguyên. Làm cách nào để tải số hàng trong tệp văn bản khớp với số nguyên trong danh sách?Làm cách nào để tải các hàng cụ thể từ tệp .txt bằng Python?

Để minh họa, nói rằng tôi có một danh sách các số nguyên:

a = [1,3,5] 

Làm thế nào tôi sẽ chỉ đọc hàng 1,3 và 5 từ một tập tin văn bản vào một mảng?

Quy trình tải trọng trong numpy cho phép bạn bỏ qua cả hai hàng và sử dụng các cột cụ thể. Nhưng tôi dường như không thể tìm cách làm điều gì đó dọc theo các dòng (bỏ qua cú pháp không đúng):

new_array = np.loadtxt('data.txt', userows=a, unpack='true') 

Cảm ơn bạn.

+0

Tệp văn bản có quá lớn/mất quá nhiều thời gian để tải vào bộ nhớ không? – wflynny

+0

Sử dụng 'numpy' để đạt được điều này là một yêu cầu? – Bakuriu

+5

Bạn không thể sử dụng một tiêu chuẩn 'trong khi mở (tập tin) như fd: cho n, dòng trong liệt kê (fd)' vòng lặp và nếu 'n' bằng bất cứ điều gì trong' a' làm công cụ của bạn? –

Trả lời

5

Với tập tin này:

1,2,3 
4,5,6 
7,8,9 
10,11,12 
13,14,15 
16,17,18 
19,20,21 

Bạn có thể sử dụng các mô-đun csv để có được những mảng np mong muốn:

import csv 
import numpy as np 

desired=[1,3,5] 
with open('/tmp/test.csv', 'r') as fin: 
    reader=csv.reader(fin) 
    result=[[int(s) for s in row] for i,row in enumerate(reader) if i in desired] 

print(np.array(result)) 

Prints:

[[ 4 5 6] 
[10 11 12] 
[16 17 18]] 
3

Chỉ cần để mở rộng nhận xét của tôi

$ cat file.txt 
line 0 
line 1 
line 2 
line 3 
line 4 
line 5 
line 6 
line 7 
line 8 
line 9 
line 10 

Python:

#!/usr/bin/env python 

a = [1, 4, 8] 

with open('file.txt') as fd: 
    for n, line in enumerate(fd): 
     if n in a: 
      print line.strip() 

đầu ra:

$ ./l.py 
line 1 
line 4 
line 8 
0

Sử dụng CSV moduleFiles.xreadlines().

  • CSV module: thực hiện các lớp học để đọc và ghi dữ liệu dạng bảng ở định dạng CSV

  • Files.xreadlines(): Return một iterator trên các phím của từ điển. Đây là một phím tắt cho iterkeys(). Không được chấp nhận kể từ phiên bản 2.3: Sử dụng for line in file để thay thế.

0

tôi wou ld đề xuất sử dụng line.split() thay vì line.strip(). line.split() trả về danh sách, có thể dễ dàng chuyển đổi thành numpy.array bằng cách sử dụng lệnh np.asarray.