2015-05-04 28 views
5

Tôi đang cố gắng sử dụng nó để thao tác dữ liệu trong các tệp txt lớn.Trích xuất các cột có chứa một tên nhất định

Tôi có tệp txt với hơn 2000 cột và khoảng 1/3 trong số đó có tiêu đề chứa từ 'Net'. Tôi chỉ muốn trích xuất các cột này và ghi chúng vào một tệp txt mới. Bất kỳ đề nghị về cách tôi có thể làm điều đó?

Tôi đã tìm kiếm xung quanh một chút nhưng không thể tìm thấy thứ gì đó giúp tôi. Xin lỗi nếu các câu hỏi tương tự đã được hỏi và giải quyết trước đây.

EDIT 1: Cảm ơn tất cả! Tại thời điểm viết 3 người dùng đã đề xuất các giải pháp và tất cả đều hoạt động rất tốt. Tôi thành thật không nghĩ rằng mọi người sẽ trả lời vì vậy tôi đã không kiểm tra cho một hoặc hai ngày, và đã rất vui mừng bởi điều này. Tôi rất ấn tượng.

EDIT 2: Tôi đã thêm một hình ảnh cho thấy những gì một phần của bản gốc txt file có thể như thế nào, trong trường hợp nó sẽ giúp bất cứ ai trong tương lai:

Sample from original txt-file

+0

bạn có thể vui lòng đính kèm một mẫu nhỏ của tập tin của bạn với các câu hỏi để làm cho báo cáo vấn đề rõ ràng hơn một chút? – ZdaR

+0

Chắc chắn! Tôi đã nhận được sự giúp đỡ, nhưng bây giờ tôi đã bao gồm một hình ảnh nhỏ từ một mẫu mã trong trường hợp nó sẽ giúp bất cứ ai trong tương lai – Rickyboy

Trả lời

6

Một cách để thực hiện việc này, mà không cần cài đặt mô-đun của bên thứ ba như numpy/gấu trúc, như sau. Với một tập tin đầu vào, gọi là "input.csv" như thế này:

a, b, c_net, d, e_net

0,0,1,0,1

0,0,1, 0,1

(loại bỏ các dòng trống ở giữa, họ chỉ là để định dạng nội dung trong bài viết này)

các mã sau đây làm những gì bạn muốn.

import csv 


input_filename = 'input.csv' 
output_filename = 'output.csv' 

# Instantiate a CSV reader, check if you have the appropriate delimiter 
reader = csv.reader(open(input_filename), delimiter=',') 

# Get the first row (assuming this row contains the header) 
input_header = reader.next() 

# Filter out the columns that you want to keep by storing the column 
# index 
columns_to_keep = [] 
for i, name in enumerate(input_header): 
    if 'net' in name: 
     columns_to_keep.append(i) 

# Create a CSV writer to store the columns you want to keep 
writer = csv.writer(open(output_filename, 'w'), delimiter=',') 

# Construct the header of the output file 
output_header = [] 
for column_index in columns_to_keep: 
    output_header.append(input_header[column_index]) 

# Write the header to the output file 
writer.writerow(output_header) 

# Iterate of the remainder of the input file, construct a row 
# with columns you want to keep and write this row to the output file 
for row in reader: 
    new_row = [] 
    for column_index in columns_to_keep: 
     new_row.append(row[column_index]) 
    writer.writerow(new_row) 

Lưu ý rằng không có lỗi xử lý. Có ít nhất hai cái đó nên được xử lý. Đầu tiên là kiểm tra sự tồn tại của tệp đầu vào (gợi ý: kiểm tra chức năng cung cấp bởi các mô-đun os và os.path). Cách thứ hai là xử lý các dòng trống hoặc các dòng có số lượng cột không nhất quán.

+0

Wow cảm ơn rất nhiều, hoạt động như một sự quyến rũ! Rất ấn tượng :) – Rickyboy

4

Điều này có thể làm ví dụ với Pandas,

import pandas as pd 

df = pd.read_csv('path_to_file.txt', sep='\s+') 
print(df.columns) # check that the columns are parsed correctly 
selected_columns = [col for col in df.columns if "net" in col] 
df_filtered = df[selected_columns] 
df_filtered.to_csv('new_file.txt') 

Tất nhiên, vì chúng ta không có cấu trúc của tập tin văn bản của bạn, bạn sẽ phải thích nghi với những lập luận của read_csv để làm công việc này trong trường hợp của bạn (xem tương ứng documentation).

Thao tác này sẽ tải tất cả tệp trong bộ nhớ rồi lọc ra các cột không cần thiết. Nếu tệp của bạn quá lớn đến mức không thể nạp vào RAM cùng một lúc, có một cách để chỉ tải các cột cụ thể với đối số usecols.

+0

Gọn gàng! Hoạt động hoàn hảo – Rickyboy

3

Bạn có thể sử dụng chức năng lọc gấu trúc để chọn vài cột dựa trên regex

data_filtered = data.filter(regex='net') 
+0

Rất tuyệt!Dòng đơn giản này hoạt động rất tốt để trích xuất các cột khi tệp đã được đọc. Cảm ơn bạn! – Rickyboy

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