2012-09-06 39 views
19

Tôi rất mới với Python. Tôi muốn phân tích một tập tin csv như vậy mà nó sẽ nhận ra giá trị niêm yết - ví dụPhân tích cú pháp Python CSV chính xác

1997,Ford,E350,"Super, luxurious truck"

nên được chia như

('1997', 'Ford', 'E350', 'Super, luxurious truck')

và KHÔNG

('1997', 'Ford', 'E350', '"Super', ' luxurious truck"')

ở trên là những gì tôi nhận được nếu tôi sử dụng một cái gì đó như str.split(,).

Làm cách nào để thực hiện việc này? Cũng tốt nhất là lưu trữ các giá trị này trong một mảng hoặc một số cấu trúc dữ liệu khác? bởi vì sau khi tôi nhận được các giá trị này từ csv, tôi muốn có thể dễ dàng chọn, cho phép nói bất kỳ hai cột nào và lưu trữ nó dưới dạng mảng khác hoặc một số cấu trúc dữ liệu khác.

+0

Tôi đã chỉnh sửa câu hỏi. Nếu tôi chỉ sử dụng dấu phân tách ',' nó không nhận ra ',' trong dấu ngoặc kép – cornerstone

+0

Bạn phải xác định 'quote' –

Trả lời

14

Sau đây phương pháp hoạt động hoàn hảo

d = {} 
d['column1name'] = [] 
d['column2name'] = [] 
d['column3name'] = [] 

dictReader = csv.DictReader(open('filename.csv', 'rb'), fieldnames = ['column1name', 'column2name', 'column3name'], delimiter = ',', quotechar = '"') 

for row in dictReader: 
    for key in row: 
     d[key].append(row[key]) 

Các cột được lưu trữ trong từ điển có tên cột làm khóa.

+0

có một dấu trích dẫn bắt đầu bị thiếu ở phía trước col3name. – codingknob

18

Bạn nên sử dụng csv mô-đun:

import csv 
reader = csv.reader(['1997,Ford,E350,"Super, luxurious truck"'], skipinitialspace=True) 
for r in reader: 
    print r 

đầu ra:

['1997', 'Ford', 'E350', 'Super, luxurious truck'] 
+0

cảm ơn. Nhưng khi tôi thử đọc từ tập tin tôi nhận được lỗi sau- 'csv.Error: dòng chứa NULL byte' tệp của tôi có thể chứa một triệu dòng như sau - ' 1 ,, "Cảnh báo, lỗi không xác định", "car-8554.gif", "car.gif", "crs_04", "thay đổi rand str, cut pos, 35289, thêm kích thước, 9242" ' – cornerstone

+0

@cornerstone: bạn tạo tệp này bằng cách nào? Bạn sẽ không nhận được byte NULL để hiển thị ở đây thông qua các phương tiện thông thường, nhưng nếu nó nằm trong tập tin, nó sẽ là một vấn đề để đọc nó thông qua gần như bất kỳ phương tiện nào nếu bạn coi nó như là văn bản. – geoffspear

+0

@Wooble nó được tạo ra bằng cách bán các giá trị dữ liệu SQL vào tệp csv. Tôi đã tìm ra giá trị null là do ",," hiện tại liên tiếp trong các dòng .. Tôi đã tìm ra một giải pháp cho điều đó. 'với mở (r'car.csv ') dưới dạng csv_file: ... reader = csv.reader ((line.replace (' \ 0 ',' ') cho dòng trong csv_file), delimiter =', ', quotechar = '"') ... in (reader.next())' – cornerstone

5

Bạn cần phải xác định doublequote như quotechar whithin tuyên bố csv.reader():

>>> with open(r'<path_to_csv_test_file>') as csv_file: 
...  reader = csv.reader(csv_file, delimiter=',', quotechar='"') 
...  print(reader.next()) 
... 
['1997', 'Ford', 'E350', 'Super, luxurious truck'] 
>>> 
1

Nếu bạn không muốn sử dụng mô-đun CSV, bạn cần sử dụng cụm từ thông dụng. Hãy thử điều này:

import re 
array = re.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", '1997,Ford,E350,"Super, luxurious truck"') 

Nếu bạn cố gắng:

print(array[3]) 

bạn sẽ nhận được:

"Super, luxurious truck" 
Các vấn đề liên quan