Computer >> Máy Tính >  >> Lập trình >> Python

Đọc và ghi tệp CSV bằng Python

Định dạng CSV (viết tắt của các giá trị được phân tách bằng dấu phẩy) là một định dạng dữ liệu thường được sử dụng trong bảng tính. Mô-đun csv trong thư viện chuẩn của Python trình bày các lớp và phương pháp để thực hiện các thao tác đọc / ghi trên tệp CSV.

nhà văn ()

Hàm này trong mô-đun csv trả về một đối tượng nhà văn chuyển đổi dữ liệu thành một chuỗi được phân tách và lưu trữ trong một đối tượng tệp. Hàm cần một đối tượng tệp có quyền ghi dưới dạng tham số. Mỗi hàng được viết trong tệp sẽ tạo ra một ký tự dòng mới. Để ngăn thêm khoảng cách giữa các dòng, tham số dòng mới được đặt thành ‘’.

Lớp nhà văn có các phương thức sau

writerow ()

Hàm này ghi các mục trong một tệp có thể lặp lại (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 tệp lặp lại làm tham số và ghi mỗi mục dưới dạng một dòng mục được phân tách bằng dấu phẩy trong tệp.

Ví dụ sau cho thấy việc sử dụng hàm write (). Đầu tiên, một tệp được mở ở chế độ ‘w’. Tệp này được sử dụng để lấy đối tượng nhà văn. Mỗi bộ trong danh sách các bộ sau đó được ghi vào tệp bằ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 ‘people.csv’ trong thư mục hiện tại. Nó sẽ hiển thị dữ liệu sau đây.

Lata,22,45
Anil,21,56
John,20,60

Trường hợp lặp qua danh sách để viết 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()

read ()

hàm này trả về một đối tượng reader trả về một trình lặp 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 trình lặp, nên hàm next () tích hợp sẵn 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

Mô-đun csv cũng định nghĩa một lớp phương ngữ. Phương ngữ là tập hợp các tiêu chuẩn được sử dụng để triển khai giao thức CSV. Danh sách các phương ngữ có sẵn có thể được lấy 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 nhà văn, nhưng các hàng được ánh xạ tới đối tượng từ điển. Hàm cần một đối tượng tệp có quyền ghi và danh sách các khóa được sử dụng trong từ điển dưới dạng tham số tên trường. Điều này được sử dụng để viết dòng đầu tiên trong tệp dưới dạng tiêu đề.

writeheader ()

Phương thức này ghi danh sách các khóa trong từ điển dưới dạng một dòng được phân tách bằng dấu phẩy ở 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 xác định. Mỗi mục trong danh sách là một từ điển. Sử dụng phương thức wrirows (), chúng được ghi vào tệp theo cách được phân tá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 này hiển thị các 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 bên dưới. Như trong trường hợp đối tượng reader, đối tượng này cũng là một trình lặp, sử dụng nội dung nào của tệp được truy xuất.

>>> csvfile = open('persons.csv','r', newline='')
>>> obj = csv.DictReader(csvfile)

Lớp này cung cấp thuộc tính tên trường, trả về các khóa từ điển được sử dụng làm tiêu đề của tệp.

>>> obj.fieldnames
['name', 'age', 'marks']

Sử dụng vòng lặp qua đối tượng DictReader để tìm nạp các đối tượng từ điển riêng lẻ.

>>> for row in obj:
print (row)

Điều này dẫn đến kết quả 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 sang từ điển thông thường, trước tiên chúng ta phải nhập OrderedDict từ mô-đun bộ sưu tập.

>>> 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 mô-đun csv đã được giải thích.