2011-01-20 41 views
10

Tôi có một quy trình nơi tệp CSV có thể được tải xuống, chỉnh sửa rồi tải lên lại. Trên download, file CSV có định dạng đúng, không có gói dấu ngoặc képPython CSV: Xóa trích dẫn khỏi giá trị

1, someval, someval2 

Khi tôi mở CSV trong bảng tính, chỉnh sửa và lưu, nó sẽ thêm dấu ngoặc kép quanh chuỗi

1, "someEditVal", "someval2" 

Tôi nhận thấy đây chỉ là hành động của bảng tính (trong trường hợp này là openoffice). Tôi muốn tập lệnh tải lên của mình xóa các dấu ngoặc kép gói. Tôi không thể loại bỏ tất cả các dấu ngoặc kép, chỉ cần trong cơ thể chứa chúng, và tôi cũng không muốn chỉ kiểm tra ký tự đầu tiên và cuối cùng cho dấu ngoặc kép.

Im gần như chắc chắn rằng thư viện CSV trong python sẽ biết làm thế nào để xử lý này, nhưng không chắc chắn làm thế nào để sử dụng nó ...

EDIT Khi tôi sử dụng các giá trị trong một cuốn từ điển, họ lần lượt ra như sau

{'header':'"value"'} 

Cảm ơn

+1

Các dấu ngoặc kép thường được coi là phép trong tệp CSV. Bạn có chắc chắn phải xóa chúng không? –

+0

Vâng, Im sử dụng chúng trong một kịch bản xử lý đưa chúng vào một từ điển, và chúng hóa ra như thế này {'header': '"value"'} – neolaser

+0

Mở office calc 3.2 KHÔNG ĐƯỢC đặt dấu cách sau dấu phẩy. Phiên bản nào bạn đang sử dụng? –

Trả lời

12

Đối với bạn Ví dụ, các công việc sau:

import csv 
writer = csv.writer(open("out.csv", "wb"), quoting=csv.QUOTE_NONE) 
reader = csv.reader(open("in.csv", "rb"), skipinitialspace=True) 
writer.writerows(reader) 

Bạn có thể cần phải chơi với các tùy chọn phương ngữ của trình đọc và ghi CSV - xem documentation of the csv module.

+1

QUOTE_NONE hoạt động khi tải xuống/tạo CSV, thật tuyệt vời! Nhưng vấn đề của tôi là khi tôi chỉnh sửa csv (đó là nơi các dấu ngoặc kép được thêm vào) và tải nó lên một lần nữa. Cảm ơn câu trả lời hữu ích mặc dù! – neolaser

+0

Mã tôi đã cung cấp không phải để phân tích cú pháp tệp - đó là để chuyển đổi tệp "sai" của bạn thành tệp "đúng". Nếu bạn chỉ muốn đọc nó, chỉ sử dụng người đọc chứ không phải người viết. Có lẽ bạn chỉ cần 'skipinitialspace = True'? –

+2

QUOTE_NONE KHÔNG phải là một ý kiến ​​hay nếu như OP cho biết anh ta có nội dung "" trong nội dung –

6

Nhờ tất cả những người đang cố gắng giúp tôi, nhưng tôi đã tìm ra. Khi chỉ định người đọc, bạn có thể xác định quotechar

csv.reader(upload_file, delimiter=',', quotechar='"') 

Điều này xử lý dấu ngoặc kép của chuỗi.

+3

Hai thông số bạn vượt qua chỉ là các giá trị mặc định - bạn có thể bỏ qua chúng! Và điều này sẽ không phân tích cú pháp dữ liệu ví dụ trong câu hỏi của bạn - điều này sẽ chỉ hoạt động với 'skipinitialspace = True'. –

+0

ah ok, cảm ơn Sven! Tôi bỏ qua các thông số và nó vẫn hoạt động, nhờ sự giúp đỡ. Tôi đã sử dụng trình đọc bằng cách sử dụng các tham số mặc định. Nếu bạn muốn đăng câu trả lời bị đánh dấu là – neolaser

+0

Nếu công trình này hoạt động, bạn không đăng dữ liệu thực trong câu hỏi của mình. Đối với dữ liệu trong câu hỏi, điều này không hoạt động. –

1

Đối Python 3:

import csv 
writer = csv.writer(open("query_result.csv", "wt"), quoting=csv.QUOTE_NONE, escapechar='\\') 
reader = csv.reader(open("out.txt", "rt"), skipinitialspace=True) 
writer.writerows(reader) 

Câu trả lời ban đầu cho lỗi này dưới Python 3. Ngoài Xem này SO để xem chi tiết: csv.Error: iterator should return strings, not bytes

Traceback (most recent call last): File "remove_quotes.py", line 11, in writer.writerows(reader) _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

+0

tại sao có ''rt''mode cho' writer' và 'wt' cho' reader'? Tôi cũng nghĩ rằng bạn nên đặt 'escapechar' – Zangetsu

+0

@Zangetsu Đó là một cuộc gọi tốt. Cảm ơn đã chỉ ra điều đó. Tôi sẽ cập nhật câu trả lời. –

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