Các bài tập về file trong Python

Câu lệnh 1 để mở file đọc Câu lệnh 2 đọc toàn bộ file và in ra màn hình Câu lệnh 3: in ra màn hình thông báo vị trí con trỏ hiện thời [là vị trí cuối file] Câu lệnh 4: chuyển con trỏ về vị trí 0 [đầu file] Câu lệnh 5: đọc 5 ký tự [5 bytes] và gán vào biến doc Câu lệnh 6: in biến doc ra màn hình Câu lệnh 7: in ra màn hình thông báo vị trí con trỏ hiện thời Câu lệnh 8: Chuyển con trỏ đến vị trí 13 Câu lệnh 9: đọc đến cuối file và in ra màn hình
Giải thích: Câu lệnh 1 để mở file đọc Câu lệnh 2 đọc toàn bộ file và in ra màn hình Câu lệnh 3: in ra màn hình thông báo vị trí con trỏ hiện thời [là vị trí cuối file] Câu lệnh 4: chuyển con trỏ về vị trí 0 [đầu file] Câu lệnh 5: đọc 5 ký tự [5 bytes] và gán vào biến doc Câu lệnh 6: in biến doc ra màn hình Câu lệnh 7: in ra màn hình thông báo vị trí con trỏ hiện thời Câu lệnh 8: Chuyển con trỏ đến vị trí 13 Câu lệnh 9: đọc đến cuối file và in ra màn hình

Đọc ghi file trong Python hoặc trong bất kỳ ngôn ngữ nào khác là một thao tác thường xuyên được sử dụng trong quá trình làm việc. Bài viết này sẽ hướng dẫn bạn chi tiết cách đọc file trong Python và ghi file trong Python. Ngoài ra, mình cũng sẽ chia sẻ cách đọc ghi cấu trúc từ điển ra file JSON.

NỘI DUNG BÀI VIẾT

Đọc ghi file trong Python

Quá trình đọc ghi file trong Python trải qua 3 bước: Mở file, Đọc hoặc ghi file và cuối cùng là đóng file. Nhưng đầu tiên, chúng ta sẽ xem xét các mode khi làm việc với file trong Python nhé.

Mode truy cập tệp trong Python

Khá giống với các ngôn ngữ khác, việc đọc ghi file trong Python cũng có các mode làm việc tương ứng.

ModeGiải thíchRead Only [‘r’]Mode mặc định khi mở tệp. Ở chế độ này, tệp được mở ở chế độ chỉ được phép đọc dữ liệu và con trỏ tệp bắt đầu ở vị trí đầu tệp. Nếu tệp không tồn tại, sẽ gặp ngoại lệ FileNotFoundError.Read & Write [‘r+’]Mở file cho phép cả đọc và ghi. Vị trí con trỏ tệp ở vị trí đầu của tệp. Nếu tệp không tồn tại, sẽ gặp ngoại lệ FileNotFoundError.Write Only [‘w’]Mở file và chỉ cho phép ghi. Vị trí con trỏ tệp ở vị trí đầu của tệp. Nếu tệp không tồn tại, sẽ tự động tạo mới. Nếu tệp đã tồn tại, dữ liệu cũ sẽ bị ghi đè bằng dữ liệu mới.Write & Read [‘w+’]Mở file cho phép cả đọc và ghi. Vị trí con trỏ tệp ở vị trí đầu của tệp. Nếu tệp không tồn tại, sẽ tự động tạo mới. Nếu tệp đã tồn tại, dữ liệu cũ sẽ bị ghi đè bằng dữ liệu mới.Append Only [‘a’]Mở file cho phép ghi. File sẽ được tạo mới nếu chưa tồn tại. Con trỏ tệp sẽ ở cuối file nên sẽ tiếp tục ghi dữ liệu vào cuối nếu ban đầu đã có dữ liệu.Append & Read [‘a+’]Mở file cho phép ghi và đọc. File sẽ được tạo mới nếu chưa tồn tại. Con trỏ tệp sẽ ở cuối file nên sẽ tiếp tục ghi dữ liệu vào cuối nếu ban đầu đã có dữ liệu.

Mở file trong Python

Để mở file trong Python, chúng ta không cần phải import thêm thư viện nào cả, chúng ta sẽ sử dụng hàm open[] built-in có cú pháp như sau:

1

file_object = open[r'đường_dẫn_tới_file', 'mode']

Lưu ý: Ký tự r trước đường dẫn tới file giúp bỏ qua các ký tự đặc biệt của string trong Python. Chẳng hạn, nếu không có ký tự r này thì \t trong đường dẫn D:\text\myfile.txt này sẽ bị coi là dấu tab, dẫn tới xảy ra lỗi không mong muốn.

Ví dụ:

1

2

3

4

5

6

7

8

9

10

# mở file để đọc, mode = 'r'

rf = open['data.txt', 'r']

# hoặc

rf = open['data.txt']

 

# mở file để ghi

wf = open['data.txt', 'w']

 

# mở file để ghi vào cuối

wf = open['data.txt', 'a']

Đóng file trong Python

Sử dụng hàm close[] để đóng đối tượng tệp khi bạn đã làm việc xong với nó. Hãy luôn nhớ đóng file sau khi làm việc xong nếu không muốn phát sinh các vấn đề không mong muốn.

Ví dụ:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

# mở file để đọc, mode = 'r'

rf = open['data.txt', 'r']

# hoặc

rf = open['data.txt']

# đóng file

rf.close[]

 

# mở file để ghi

wf = open['data.txt', 'w']

# đóng file

wf.close[]

 

# mở file để ghi vào cuối

wf = open['data.txt', 'a']

# đóng file

wf.close[]

Một cách linh hoạt hơn [nên dùng] khi làm việc với file mà không cần phải lo khi nào đóng file. Hãy sử dụng từ khóa with như sau:

1

2

3

4

5

# Python sẽ tự động đóng file cho bạn

with open['/home/user/data.txt', 'r'] as fp:

    # doing smt

 

# tiếp tục các khối lệnh khác ...

Đọc file trong Python

Python cung cấp cho bạn 3 cách khác nhau để đọc nội dung từ tập tin. Mình sẽ đi trực tiếp vào ví dụ để các bạn có thể hiểu & áp dụng được ngay

Đọc toàn bộ file ra string

Sử dụng hàm read[] để đọc toàn bộ nội dung file vào 1 biến string.

1

2

3

4

5

with open['data.txt'] as rf:

    content = rf.read[]

print[content]

content = content + "\n\nFrom LTKK with love"

print[content]

Kết quả nhận được [cũng chính là nội dung file data.txt]:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

Kích thước cố định

Cần chỉ rõ kích thước trong khi khai báo

Kích thước thay đổi trong quá trình thêm/ xóa phần tử

Kích thước tối đa phụ thuộc vào bộ nhớ

typedef được dùng để định nghĩa một kiểu dữ liệu trong C.

malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new

sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc

Kích thước cố định

Cần chỉ rõ kích thước trong khi khai báo

Kích thước thay đổi trong quá trình thêm/ xóa phần tử

Kích thước tối đa phụ thuộc vào bộ nhớ

typedef được dùng để định nghĩa một kiểu dữ liệu trong C.

malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new

sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc

 

From LTKK with love

Đọc từng dòng của file

Sử dụng hàm readline[] sẽ trả về 1 dòng nội dung của file. Chúng ta có thể duyệt qua từng dòng nội dung của file như sau:

1

2

3

4

5

6

7

with open['data.txt'] as rf:

    line = rf.readline[]

    index = 1

    while line:

        print['Line {}: {}'.format[index, line]]

        index += 1

        line = rf.readline[]

Kết quả:

1

2

3

4

5

6

7

8

9

10

11

12

13

Line 1: Kích thước cố định

 

Line 2: Cần chỉ rõ kích thước trong khi khai báo

 

Line 3: Kích thước thay đổi trong quá trình thêm/ xóa phần tử

 

Line 4: Kích thước tối đa phụ thuộc vào bộ nhớ

 

Line 5: typedef được dùng để định nghĩa một kiểu dữ liệu trong C.

 

Line 6: malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new

 

Line 7: sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc

Hàm readline[] sẽ đọc 1 dòng, bao gồm cả ký tự newline [‘\n’]. Nên khi in ra, mỗi dòng có thể 1 dòng trống ở phía dưới như kết quả ở trên.

Đọc toàn bộ file ra list

Vẫn là đọc toàn bộ file nhưng hàm r0 sẽ trả về một list tương ứng mỗi dòng dữ liệu là 1 phần tử của list.

1

2

3

4

with open['data.txt'] as rf:

    lines = rf.readlines[]

    for idx, line in enumerate[lines]:

        print[idx, line]

Kết quả:

1

2

3

4

5

6

7

8

9

10

11

12

13

0 Kích thước cố định

 

1 Cần chỉ rõ kích thước trong khi khai báo

 

2 Kích thước thay đổi trong quá trình thêm/ xóa phần tử

 

3 Kích thước tối đa phụ thuộc vào bộ nhớ

 

4 typedef được dùng để định nghĩa một kiểu dữ liệu trong C.

 

5 malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new

 

6 sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc

Lưu ý: Bạn có thể dùng hàm r1 để xóa khoảng trắng thừa ở đầu & cuối string. Và ký tự newline ở cuối mỗi string cũng được coi là 1 khoảng trắng thừa.

Ghi file trong Python

Để ghi file trong Python, chúng ta có thể sử dụng hàm r2 để ghi 1 biến string, hoặc dùng r3 để ghi 1 list các chuỗi string.

1

2

3

4

5

6

7

8

9

10

11

12

texts = [

    "0 Kích thước cố định",

    "1 Cần chỉ rõ kích thước trong khi khai báo",

    "2 Kích thước thay đổi trong quá trình thêm/ xóa phần tử",

    "3 Kích thước tối đa phụ thuộc vào bộ nhớ",

    "4 typedef được dùng để định nghĩa một kiểu dữ liệu trong C.",

    "5 malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new",

    "6 sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc"

]

with open['data.txt', 'w'] as wf:

    for text in texts:

        wf.write[text + '\n']

Hoặc:

1

2

3

4

5

6

7

8

9

10

11

texts = [

    "0 Kích thước cố định",

    "1 Cần chỉ rõ kích thước trong khi khai báo",

    "2 Kích thước thay đổi trong quá trình thêm/ xóa phần tử",

    "3 Kích thước tối đa phụ thuộc vào bộ nhớ",

    "4 typedef được dùng để định nghĩa một kiểu dữ liệu trong C.",

    "5 malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new",

    "6 sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc"

]

with open['data.txt', 'w'] as wf:

    wf.writelines[texts]

Lưu ý:

Hàm r4 không tự động chèn thêm r5 vào cuối mỗi dòng. Nên nếu chạy code trên thì các dòng sẽ ghi liền nhau thành 1 dòng duy nhất.


1

0 Kích thước cố định1 Cần chỉ rõ kích thước trong khi khai báo2 Kích thước thay đổi trong quá trình thêm/ xóa phần tử3 Kích thước tối đa phụ thuộc vào bộ nhớ4 typedef được dùng để định nghĩa một kiểu dữ liệu trong C.5 malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new6 sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc

Ghi dữ liệu vào cuối file

Chúng ta chỉ cần đổi mode từ r6 sang r7 là được. Xem ví dụ:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

texts = [

    "0 Kích thước cố định",

    "1 Cần chỉ rõ kích thước trong khi khai báo",

    "2 Kích thước thay đổi trong quá trình thêm/ xóa phần tử",

    "3 Kích thước tối đa phụ thuộc vào bộ nhớ",

    "4 typedef được dùng để định nghĩa một kiểu dữ liệu trong C.",

    "5 malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new",

    "6 sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc"

]

with open['data.txt', 'w'] as wf:

    for text in texts:

        wf.write[text + '\n']

 

with open['data.txt'] as wr:

    print["Number of line:", len[wr.readlines[]]]

 

# Ghi file vào cuối

with open['data.txt', 'a'] as wf:

    wf.write['=> From LTKK with love']

 

with open['data.txt'] as wr:

    texts = wr.readlines[]

    print["Number of line:", len[texts]]

    print[texts]

Kết quả:

1

2

3

Number of line: 7

Number of line: 8

['0 Kích thước cố định\n', '1 Cần chỉ rõ kích thước trong khi khai báo\n', '2 Kích thước thay đổi trong quá trình thêm/ xóa phần tử\n', '3 Kích thước tối đa phụ thuộc vào bộ nhớ\n', '4 typedef được dùng để định nghĩa một kiểu dữ liệu trong C.\n', '5 malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new\n', '6 sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho hàm malloc\n', '=> From LTKK with love']

[sc_]

Đọc ghi JSON từ file

Trong phần này, chúng ta sẽ làm việc với tệp tin JSON sử dụng ngôn ngữ Python. Giả sử chúng ta có file JSON như sau:

Cách đọc file JSON

1

2

3

4

5

6

import json

 

with open['customer.json'] as wr:

    customers = json.load[wr]

    for customer in customers:

        print[customer, type[customer]]

Kết quả:

1

2

{'id': 1, 'email': '[email protected]', 'first': 'Torrey', 'last': 'Veum', 'company': 'Hilll, Mayert and Wolf', 'created_at': '2014-12-25T04:06:27.981Z', 'country': 'Switzerland'}

{'id': 2, 'email': '[email protected]', 'first': 'Micah', 'last': 'Sanford', 'company': 'Stokes-Reichel', 'created_at': '2014-07-03T16:08:17.044Z', 'country': "Democratic People's Republic of Korea"}

Ghi dữ liệu từ điển ra file JSON

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

import json

 

customers = [

    {

        "id": 1,

        "email": "[email protected]",

        "first": "Torrey",

        "last": "Veum",

        "company": "Hilll, Mayert and Wolf",

        "created_at": "2014-12-25T04:06:27.981Z",

        "country": "Switzerland"

    },

    {

        "id": 2,

        "email": "[email protected]",

        "first": "Micah",

        "last": "Sanford",

        "company": "Stokes-Reichel",

        "created_at": "2014-07-03T16:08:17.044Z",

        "country": "Democratic People's Republic of Korea"

    }

]

 

with open['customer.json', 'w'] as wr:

    json.dump[customers, wr]

Lưu ý:

  • Với dữ liệu tiếng Việt, hàm r8 và r9 sẽ đưa toàn bộ về bảng mã ASCII. Do đó, nếu bạn muốn đọc được file JSON khi mở bằng Editor, thêm option \t0.
  • Nếu muốn làm đẹp file JSON, hãy thêm option \t1 vào hàm r8 nhé. Trong đó, 2 số lượng dấu cách [space] dùng để format tệp tin.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

import json

 

customers = [

    {

        "id": 1,

        "email": "[email protected]",

        "first": "Hiếu",

        "last": "Nguyễn Văn",

        "company": "Zalo",

        "created_at": "2014-12-25T04:06:27.981Z",

        "country": "Việt Nam"

    },

    {

        "id": 2,

        "email": "[email protected]",

        "first": "Micah",

        "last": "Sanford",

        "company": "Stokes-Reichel",

        "created_at": "2014-07-03T16:08:17.044Z",

        "country": "Democratic People's Republic of Korea"

    }

]

 

with open['customer.json', 'w'] as wr:

    json.dump[customers, wr, ensure_ascii=False, indent=2]

Kết quả:

 

Như vậy, bài viết đã trình bày các nội dung cần thiết đến bạn đọc về nội dung đọc ghi file trong Python. Với những kiến thức căn bản này, bạn hoàn toàn có thể sử dụng đáp ứng yêu cầu trong công việc rồi. Chúc các bạn học tập tốt!

Tham gia nhóm Lập Trình Không Khó nhé: //www.facebook.com/groups/1023125804557712/

  • TAGS
  • đọc ghi file
  • khóa học python
  • lập trình python
  • python

Facebook

Twitter

Pinterest

WhatsApp

Nguyễn Văn Hiếu

Sáng lập cộng đồng Lập Trình Không Khó với mong muốn giúp đỡ các bạn trẻ trên con đường trở thành những lập trình viên tương lai. Tất cả những gì tôi viết ra đây chỉ đơn giản là sở thích ghi lại các kiến thức mà tôi tích lũy được.

Chủ Đề