CSV (viết tắt của comma separated values - giá trị phân cách bằng dấu phẩy) là định dạng dữ liệu thường được sử dụng bởi các bảng tính. Module csv trong thư viện chuẩn của Python cung cấp các lớp và phương thức để thực hiện các thao tác đọc/ghi trên tệp CSV.
Hàm writer()
Hàm này trong module csv trả về một đối tượng writer chuyển đổi dữ liệu thành chuỗi phân cách và lưu trữ trong đối tượng tệp. Hàm cần một đối tượng tệp có quyền ghi làm tham số. Mỗi hàng được ghi vào tệp phát ra ký tự xuống dòng. Để ngăn khoảng trống thêm giữa các dòng, tham số newline được đặt thành ''.
Lớp writer có các phương thức sau:
writerow()
Hàm này ghi các mục trong một iterable (danh sách, tuple hoặc chuỗi), phân tách chúng bằng ký tự dấu phẩy.
writerows()
Hàm này nhận một danh sách các iterable làm tham số và ghi từng mục như một dòng các mục phân cách bằng dấu phẩy trong tệp.
Ví dụ sau cho thấy sử dụng hàm writer(). Đầu tiên một tệp được mở ở chế độ 'w'. Tệp này được dùng để lấy đối tượng writer. Mỗi tuple trong danh sách các tuple sau đó được ghi vào tệp sử dụng phương thức writerow().
>>> import csv
>>> persons = [('Lata', 22, 45), ('Anil', 21, 56), ('John', 20, 60)]
>>> csvfile = open('persons.csv', 'w', newline='')
>>> obj = csv.writer(csvfile)
>>> for person in persons:
... obj.writerow(person)
>>> csvfile.close()
Thao tác này sẽ tạo tệp persons.csv trong thư mục hiện tại. Nó sẽ hiển thị dữ liệu sau:
Lata,22,45 Anil,21,56 John,20,60
Thay vì lặp qua danh sách để ghi từng hàng riêng lẻ, chúng ta có thể sử dụng phương thức writerows().
>>> csvfile = open('persons.csv', 'w', newline='')
>>> obj = csv.writer(csvfile)
>>> obj.writerows(persons)
>>> obj.close()
Hàm reader()
Hàm này trả về một đối tượng reader trả về một iterator của các dòng trong tệp csv. Sử dụng vòng lặp for thông thường, tất cả các dòng trong tệp được hiển thị trong ví dụ sau.
>>> csvfile = open('persons.csv', 'r', newline='')
>>> obj = csv.reader(csvfile)
>>> for row in obj:
... print(row)
['Lata', '22', '45']
['Anil', '21', '56']
['John', '20', '60']
Vì đối tượng reader là một iterator, hàm built-in next() cũng hữu ích để hiển thị tất cả các dòng trong tệp csv.
>>> csvfile = open('persons.csv', 'r', newline='')
>>> obj = csv.reader(csvfile)
>>> while True:
... try:
... row = next(obj)
... print(row)
... except StopIteration:
... break
Module csv cũng định nghĩa một lớp dialect. Dialect là tập hợp các tiêu chuẩn được dùng để triển khai giao thức CSV. Danh sách các dialect có sẵn có thể lấy được bằng hàm list_dialects().
>>> csv.list_dialects() ['excel', 'excel-tab', 'unix']
DictWriter()
Hàm này trả về một đối tượng DictWriter. Nó tương tự như đối tượng writer, nhưng các hàng được ánh xạ đến đối tượng từ điển. Hàm cần một đối tượng tệp có quyền ghi và một danh sách các khóa được dùng trong từ điển làm tham số fieldnames. Điều này được dùng để ghi dòng đầu tiên trong tệp làm header.
writeheader()
Phương thức này ghi danh sách khóa trong từ điển như một dòng phân cách bằng dấu phẩy làm dòng đầu tiên trong tệp.
Trong ví dụ sau, một danh sách các mục từ điển được định nghĩa. Mục mỗi trong danh sách là một từ điển. Sử dụng phương thức writerows(), chúng được ghi vào tệp theo cách phân cách bằng dấu phẩy.
>>> persons = [{'name': 'Lata', 'age': 22, 'marks': 45},
... {'name': 'Anil', 'age': 21, 'marks': 56},
... {'name': 'John', 'age': 20, 'marks': 60}]
>>> csvfile = open('persons.csv', 'w', newline='')
>>> fields = list(persons[0].keys())
>>> obj = csv.DictWriter(csvfile, fieldnames=fields)
>>> obj.writeheader()
>>> obj.writerows(persons)
>>> csvfile.close()
Tệp hiển thị nội dung sau:
name,age,marks Lata,22,45 Anil,21,56 John,20,60
DictReader()
Hàm này trả về một đối tượng DictReader từ tệp CSV cơ bản. Giống như trường hợp của đối tượng reader, đối tượng này cũng là một iterator, sử dụng nó để truy xuất nội dung tệp.
>>> csvfile = open('persons.csv', 'r', newline='')
>>> obj = csv.DictReader(csvfile)
Lớp cung cấp thuộc tính fieldnames, trả về các khóa từ điển được dùng làm header của tệp.
>>> obj.fieldnames ['name', 'age', 'marks']
Sử dụng vòng lặp trên đối tượng DictReader để lấy các đối tượng từ điển riêng lẻ.
>>> for row in obj: ... print(row)
Kết quả là đầu ra sau:
OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
OrderedDict([('name', 'Anil'), ('age', '21'), ('marks', '56')])
OrderedDict([('name', 'John'), ('age', '20'), ('marks', '60')])
Để chuyển đổi đối tượng OrderedDict thành từ điển bình thường, chúng ta phải nhập OrderedDict từ module collections.
>>> from collections import OrderedDict
>>> r = OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
>>> dict(r)
{'name': 'Lata', 'age': '22', 'marks': '45'}
Trong bài viết này, các tính năng của module csv đã được giải thích.