Tôi đã có tập tin với một định dạng mà trông như thế này một CSV:file Reading CSV trong NumPy nơi delimiter là ""
"FieldName1", "FieldName2", "FieldName3", "FieldName4"
"04/13/2010 14: 45: 07.008", "7.59484916392", "10", "6.552373"
"04/13/2010 14: 45: 22.010", "6.55478493312", "9", " 3.5378543 "
...
Lưu ý rằng có các ký tự trích dẫn kép ở đầu và cuối mỗi dòng trong t tệp CSV và chuỗi ","
được sử dụng để phân tách các trường trong mỗi dòng. Số lượng trường trong tệp CSV có thể thay đổi từ tệp này sang tệp khác.
Khi tôi cố gắng đọc này vào numpy qua:
import numpy as np
data = np.genfromtxt(csvfile, dtype=None, delimiter=',', names=True)
tất cả các dữ liệu được đọc trong khi giá trị chuỗi, bao quanh bởi ký tự ngoặc kép. Không hợp lý, nhưng không sử dụng nhiều đối với tôi như tôi sau đó phải quay trở lại và chuyển đổi tất cả các cột để đúng kiểu của nó
Khi tôi sử dụng delimiter='","'
thay vào đó, mọi thứ hoạt động như tôi muốn, trừ cho 1 và cuối cùng lĩnh vực. Khi bắt đầu dòng và ký tự kết thúc của dòng là một ký tự trích dẫn kép duy nhất, ký tự này không được xem là dấu phân cách hợp lệ cho trường đầu tiên và cuối cùng, vì vậy chúng được đọc như ví dụ: "04/13/2010 14:45:07.008
và 6.552373"
- lưu ý các ký tự ngoặc kép hàng đầu và cuối cùng tương ứng. Bởi vì các ký tự dư thừa này, giả định rằng các trường đầu tiên và cuối cùng là cả hai kiểu String; Tôi không muốn đó là trường hợp
Có cách nào hướng dẫn đọc sách trong các tệp được định dạng theo cách này mà tôi muốn, mà không cần phải quay lại và "sửa" cấu trúc của mảng bị sần sau lần đọc đầu tiên?
Phương thức 'str.replace ('"', '') 'sẽ hoạt động nhanh hơn biểu thức chính quy nếu tệp đầu vào lớn (nhiều MB hoặc GB) và sẽ đúng nếu bạn có thể giả sử' " 'ký tự sẽ không xuất hiện ở giữa một trường, chỉ ở cuối. – gotgenes
Cảm ơn Mike và gotgenes, nhưng tôi cũng nên đề cập rằng tệp CSV có số lượng cột thay đổi. Tôi có thể sử dụng cách tiếp cận bạn đã mô tả bằng cách thêm bước đầu tiên để đọc trong hồ sơ đầu tiên của tệp để xác định số lượng cột, sau đó sử dụng làm đầu vào cho các bước sau, nhưng có vẻ khá clunky. Có cách nào tốt hơn không? – monch1962
Lưu ý nhỏ: bạn không cần phải sử dụng 're.compile()' vì chỉ sử dụng 're.match()' trực tiếp sẽ lưu lại biểu thức chính quy đã được biên dịch. – blokeley