2016-03-06 28 views
5

Có cách nào để tôi có thể phân tích cú pháp một chuỗi phân tách bằng dấu phẩy đơn lẻ mà không sử dụng bất kỳ thứ gì lạ mắt như csv.reader (..) không? Tôi có thể sử dụng hàm split(',') nhưng không hoạt động khi giá trị cột hợp lệ chứa chính dấu phẩy. Thư viện csv có các trình đọc để phân tích cú pháp các tệp CSV xử lý chính xác trường hợp đặc biệt nói trên, nhưng tôi không thể sử dụng chúng vì tôi chỉ cần phân tích cú pháp một chuỗi duy nhất. Tuy nhiên, nếu Python CSV cho phép phân tích cú pháp một chuỗi riêng thì đó là tin tức đối với tôi.Phân tích cú pháp một chuỗi CSV?

Trả lời

11

Hãy xem xét kỹ hơn các tài liệu cho các mô-đun csv, mà nói:

reader(...) 
    csv_reader = reader(iterable [, dialect='excel'] 
          [optional keyword args]) 
     for row in csv_reader: 
      process(row) 

    The "iterable" argument can be any object that returns a line 
    of input for each iteration, such as a file object or a list. The 
    optional "dialect" parameter is discussed below. The function 
    also accepts optional keyword arguments which override settings 
    provided by the dialect. 

Vì vậy, nếu bạn có chuỗi:

>>> s = '"this is", "a test", "of the csv", "parser"' 

Và bạn muốn "đối tượng trả về một dòng đầu vào cho mỗi lặp", bạn chỉ có thể quấn dây của bạn trong một danh sách:

>>> r = csv.reader([s]) 
>>> list(r) 
[['this is', 'a test', 'of the csv parser']] 

Và đó là cách bạn phân tích một chuỗi với các module csv.

+0

Tôi đoán nó sẽ thanh lịch hơn để sử dụng 'iter (s)' như một trình lặp chung thay vì '[s]' (chỉ định một danh sách). Nhưng bạn có +1 của tôi – RafaelC

+0

Điều này có thể sẽ không hoạt động nếu chuỗi đã trích dẫn dòng dữ liệu bên trong các giá trị; @ alecxe của câu trả lời có ý nghĩa hơn – swooby

9

Bạn vẫn có thể phân tích cú pháp một chuỗi đơn với csv. Sử dụng StringIO để viết một chuỗi buffer (còn gọi là file bộ nhớ):

import csv 
from StringIO import StringIO 

s = "your string" 
buff = StringIO(s) 

reader = csv.reader(buff) 
for line in reader: 
    print(line) 
+0

Đối với Python 3 sử dụng 'từ io nhập khẩu StringIO' xem [ở đây] (https://docs.python.org/3/library/io.html#text-io) –

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