2013-07-29 41 views
21

Tôi đang cố gắng đọc tệp csv với numpy.genfromtxt nhưng một số trường là chuỗi chứa dấu phẩy. Các chuỗi nằm trong dấu ngoặc kép, nhưng không rõ ràng là không nhận ra các dấu ngoặc kép như định nghĩa một chuỗi đơn. Ví dụ, với các dữ liệu trong 't.csv':Sử dụng numpy.genfromtxt để đọc tệp csv có chuỗi chứa dấu phẩy

2012, "Louisville KY", 3.5 
2011, "Lexington, KY", 4.0 

np.genfromtxt('t.csv', delimiter=',') 

tạo ra lỗi:

ValueError: Some errors were detected ! Line #2 (got 4 columns instead of 3)

Cấu trúc dữ liệu tôi đang tìm kiếm là:

array([['2012', 'Louisville KY', '3.5'], 
     ['2011', 'Lexington, KY', '4.0']], 
     dtype='|S13') 

Nhìn qua tài liệu, tôi không thấy bất kỳ tùy chọn nào để giải quyết vấn đề này. Có cách nào để làm nó với numpy, hoặc tôi chỉ cần đọc dữ liệu với các mô-đun csv và sau đó chuyển đổi nó vào một mảng numpy?

+0

bạn có thể gửi nhiều hơn của toàn bộ csv, tôi nghĩ rằng tôi biết làm thế nào để khắc phục vấn đề của bạn;) –

+0

Bạn nên thay đổi csv của bạn thay thế các nhân vật tách từ ',' với ';' ví dụ ... –

+0

@SaulloCastro: Tôi không thể làm điều đó bởi vì dữ liệu thực của tôi có nhiều lộn xộn hơn và có các chuỗi ký tự ';' và/hoặc bất kỳ ký tự nào khác mà bạn có thể nghĩ ra - đây chỉ là một ví dụ đồ chơi. Những gì tôi đang tìm kiếm là một giải pháp tổng quát hơn. – CraigO

Trả lời

17

Bạn có thể sử dụng pandas (thư viện mặc định trở thành để làm việc với các khung dữ liệu (dữ liệu không đồng nhất) trong python khoa học) cho việc này. Đó là read_csv có thể xử lý việc này. Từ tài liệu:

quotechar : string

The character to used to denote the start and end of a quoted item. Quoted items 
can include the delimiter and it will be ignored. 

Giá trị mặc định là ". Ví dụ:

In [1]: import pandas as pd 

In [2]: from StringIO import StringIO 

In [3]: s="""year, city, value 
    ...: 2012, "Louisville KY", 3.5 
    ...: 2011, "Lexington, KY", 4.0""" 

In [4]: pd.read_csv(StringIO(s), quotechar='"', skipinitialspace=True) 
Out[4]: 
    year   city value 
0 2012 Louisville KY 3.5 
1 2011 Lexington, KY 4.0 

Bí quyết ở đây là bạn cũng phải sử dụng skipinitialspace=True để xử lý dấu cách sau dấu phẩy. Ngoài một trình đọc csv mạnh mẽ, tôi cũng có thể khuyên bạn nên sử dụng gấu trúc với dữ liệu không đồng nhất mà bạn có (kết quả ví dụ về việc bạn cung cấp tất cả các chuỗi, mặc dù bạn có thể sử dụng mảng có cấu trúc).

+0

Tuyệt vời, hoạt động như một sự quyến rũ. Tôi đã nghe một chút về 'gấu trúc' nhưng chưa bao giờ đi xung quanh để cố gắng trước đây - điều này có vẻ như là một cơ hội tuyệt vời. Và BTW, tôi đã cố giữ ví dụ ban đầu của mình đơn giản, nhưng tôi đã thực sự có kế hoạch sử dụng 'np.recfromcsv' để lấy các mảng có cấu trúc cứng nhắc. – CraigO

9

Sự cố với dấu phẩy bổ sung, np.genfromtxt không giải quyết được điều đó.

Một giải pháp đơn giản là đọc tệp với csv.reader() từ mô-đun csv của python vào danh sách và sau đó đổ nó vào một mảng có nhiều mảng nếu bạn muốn.

Nếu bạn thực sự muốn sử dụng np.genfromtxt, lưu ý rằng nó có thể mất trình vòng lặp thay vì tệp, ví dụ: np.genfromtxt(my_iterator, ...). Vì vậy, bạn có thể quấn một csv.reader trong một trình lặp và đưa nó đến np.genfromtxt.

Đó sẽ đi một cái gì đó như thế này:

import csv 
import numpy as np 

np.genfromtxt(("\t".join(i) for i in csv.reader(open('myfile.csv'))), delimiter="\t") 

này về cơ bản thay thế on-the-fly chỉ dấu phẩy thích hợp với các tab.

+0

Vâng, tôi thấy những gì bạn đang nhận được ở đây, nhưng tôi chơi xung quanh một chút nhưng vẫn không thể làm cho nó hoạt động khá tốt. Dù sao, tôi nghĩ hôm nay tôi sẽ đi với con đường 'pandas'. Dù sao cũng cảm ơn bạn. – CraigO

3

Nếu bạn đang sử dụng numpy, bạn có thể muốn làm việc với numpy.ndarray. Điều này sẽ cung cấp cho bạn một numpy.ndarray:

import pandas 
data = pandas.read_csv('file.csv').as_matrix() 

Pandas sẽ xử lý các "Lexington, KY" trường hợp một cách chính xác

+0

Lưu ý rằng nếu bạn làm điều này, hàng đầu tiên có thể bị mất. Hàng đầu tiên được coi là các nhãn cột của khung dữ liệu. –

1

Thực hiện một chức năng tốt hơn mà kết hợp sức mạnh của tiêu chuẩn csv module và NumPy của recfromcsv.Ví dụ, mô-đun csv có kiểm soát tốt và tùy chỉnh các phương ngữ, dấu ngoặc kép, ký tự thoát, v.v., mà bạn có thể thêm vào ví dụ bên dưới.

Hàm ví dụ genfromcsv_mod dưới đây đọc trong tệp CSV phức tạp tương tự như những gì Microsoft Excel thấy, có thể chứa dấu phẩy trong các trường được trích dẫn. Bên trong, hàm có một hàm máy phát điện viết lại mỗi hàng với các dấu phân tách tab.

import csv 
import numpy as np 

def recfromcsv_mod(fname, **kwargs): 
    def rewrite_csv_as_tab(fname): 
     with open(fname, 'rb') as fp: 
      reader = csv.reader(fp) 
      for row in reader: 
       yield '\t'.join(row) 
    return np.recfromcsv(rewrite_csv_as_tab(fname), delimiter='\t', **kwargs) 

# Use it to read a CSV file into a record array 
x = recfromcsv_mod('t.csv', case_sensitive=True) 
Các vấn đề liên quan