Ghi file trong python | Laptrinhcanban.com

Ghi file trong python

Hướng dẫn cách xử lý file trong Python. Bạn sẽ học được các cách ghi vào file trong python như ghi chèn file, ghi đè file, cách dùng các phương thức như write(), writelines() để ghi file, cũng như cách tạo file rỗng trong python sau bài học này.

Ghi file trong python

Để ghi file trong python, trước hết chúng ta cần mở file đó bằng hàm open() hoặc bằng câu lệnh with mà Kiyoshi đã hướng dẫn trong bài Mở và đóng file trong python, với một trong các mode sau đây:

ModeXử lýChức năng
wMở để ghi đèXoá nội dung cũ và ghi đè nội dung mới
Nếu file không tồn tại thì tạo file mới
aMở để ghi chènGhi chèn nội dung mới vào cuối file
Nếu file không tồn tại thì tạo file mới
xTạo mới và ghi fileNếu file đã tồn tại thì xảy ra lỗi
r+Mở để đọc và ghi đèCho phép cả đọc và ghi đè
Nếu file không tồn tại thì trả về lỗi
w+Mở để đọc và ghi đèCho phép cả đọc và ghi đè
Nếu file không tồn tại thì tạo file mới
a+Mở để đọc và ghi chènCho phép cả đọc và ghi chèn
Nếu file không tồn tại thì tạo file mới

Ví dụ:

f = open('myfile.txt',"w")

with open('myfile2.txt',"a") as f:
print(type(f))

f = open('myfile.txt', 'r+', encoding='UTF-8')

Sau khi mở file và thu về một object file, chúng ta có thể sử dụng các phương pháp sau để thao tác với object file và thực hiện ghi vào file trong python:

  • phương thức write() : ghi chuỗi vào file
  • phương thức write() kèm format : ghi chuỗi theo định dạng vào file
  • phương thức writelines() : ghi list vào file
  • câu lệnh pass : tạo một file trống

Hãy cùng tìm hiểu lần lượt các nội dung trên ở phần sau đây.

Ghi chuỗi vào file trong python | phương thức write()

Đúng như ý nghĩa tiếng anh của tên phương thức, write() được dùng để ghi chuỗi vào file trong python, với cú pháp sau đơn giản sau đây:

f.write(str)

Trong đó f là object file được tạo khi mở file bằng hàm open(), str là chuỗi ký tự bạn muốn ghi đè vào file.

Lưu ý là phương thức write() không tự động chèn ký tự xuống dòng vào file, nên nếu bạn muốn ghi nhiều dòng vào file, hãy thêm ký tự xuống dòng \n vào trong chuỗi cần ghi như ví dụ sau:

path_w = 'data/src/myfile.txt'
s = 'New line 1\nNew line 2\nNew line 3'

with open(path_w, mode='w') as f:
f.write(s)
with open(path_w) as f:
print(f.read())
#>> New line 1
#>> New line 2
#>> New line 3

Cần lưu ý là ký tự xuống dòng trong các hệ điều hành là khác nhau, ví dụ như trong macOS là \r còn trong Windows là \r\n chẳng hạn, tuy nhiên chỉ cần bạn chỉ định \n trong python thì chương trình sẽ tự động điều chỉnh ký tự xuống dòng cho phù hợp với OS mà bạn đang dùng.

Lại nữa, phương thức write() chỉ sử dụng để ghi chuỗi vào file trong python. Nếu chúng ta chỉ định một giá trị có kiểu dữ liệu khác kiểu chuỗi, ví dụ như là kiểu số chẳng hạn, lỗi sẽ bị trả về:

path_w = 'data/src/myfile.txt'
num = 1

with open(path_w, mode='w') as f:
f.write(num)

##>TypeError:write() argument must be str, not int

Do đó, bạn cần phải chuyển kiểu dữ liệu về kiểu chuỗi trước khi có thể tiến hành ghi nội dung vào file.

Về cách chuyển số thành chuỗi, hãy xem chi tiết tại bài Chuyển số thành chuỗi trong python.

Ghi chuỗi theo định dạng vào file trong python bằng phương thức write()

Đây là các ghi chuỗi vào file nâng cao bằng phương thức write(). Chúng ta thay đổi chuỗi cần ghi theo một định dạng chỉ định trước khi ghi nó vào trong file.

Và để định dạng chuỗi trước khi ghi vào file thì chúng ta cần sử dụng tới phương pháp định dạng chuỗi trong python bằng phương thức format mà Kiyoshi đã hướng dẫn trong bài Định dạng chuỗi trong python.

Cú pháp ghi chuỗi theo định dạng vào file trong python bằng phương thức write() sẽ như sau:

f.write(pattern. format ( value1 , value2 , value3 , …))

Trong đó f là object file được tạo khi mở file bằng hàm open(), pattern là các định dạng chuỗi chứa các trường thay thế (field) để gán giá trị (value) trong đối số của hàm format. Sau khi định dạng chuỗi xong thì chuỗi được định dạng sẽ được ghi vào trong object file.

Ví dụ cụ thể:

a = "Kiyoshi"
b = 30
c = "Tokyo"

with open('sample.txt',"w") as f:
f.write("{} {} {}\n".format(a,b,c))
f.write("{},{},{}\n".format(a,b))
f.write("name: {} age: {} address: {}\n".format(a,b))

Khi đó, các chuỗi sẽ được định dạng theo định dạng chỉ định và ghi vào file sample.txt như sau:

Kiyoshi 30 Tokyo
Kiyoshi,30,Tokyo
name: Kiyoshi age: 30 address: Tokyo

Ghi list vào file trong python | phương thức writelines()

Chúng ta có thể ghi list vào file trong python bằng cách sử dụng phương thức writelines(), với cú pháp như sau:

f.writelines(list)

Trong đó f là object file được tạo khi mở file bằng hàm open(), list là list chứa nội dung bạn muốn ghi đè vào file.
Giá trị của các phần tử trong list được chỉ định sẽ được lần lượt lấy ra và ghi đè vào file trong python.

Ví dụ:

l = ['One', 'Two', 'Three']

f=open(path_w, mode='w')
f.writelines(l)

f=open(path_w)
print(f.read())

f.close()

Cách viết tương tự với lệnh with:

l = ['One', 'Two', 'Three']

with open(path_w, mode='w') as f:
f.writelines(l)

with open(path_w) as f:
print(f.read())

Cả hai đều cho ra kết quả như sau:

OneTwoThree

Lưu ý là giống với phương thức write(), writeness() cũng không tự thêm ký tự xuống dòng khi ghi chuỗi, do đó bạn cần phải thêm ký tự xuống dòng vào giá trị của phần tử trong list khi cần thiết.

Ví dụ, bạn thêm ký tự xuống dòng khi khai báo list

l = ['One\n', 'Two\n', 'Three']

with open(path_w, mode='w') as f:
f.writelines(l)

Hoặc là thêm ký tự xuống dòng trước khi ghi vào file

l = ['One', 'Two', 'Three']

with open(path_w, mode='w') as f:
f.write('\n'.join(l))

Cả hai đều cho ra kết quả giống nhau:

One
Two
Three

Ở ví dụ trên chúng ta có sử dụng tới phương thức join() để thêm ký tự xuống dòng \ vào trong list python. Bạn có thể tìm hiểu chi tiết hơn tại bài viết Phương thức Join() trong Python

Tạo file rỗng trong python | câu lệnh pass

Trong một số chương trình, tùy vào mục đích sử dụng mà chúng ta có thể tạo một file rỗng mà không tiến hành thêm xử lý nào luôn với file đó. File này có thể được sử dụng trong các phần khác của chương trình.

Khi đó chúng ta cần mở file bằng hàm open() với mode w, kèm với sử dụng lệnh pass như ví dụ sau đây:

with open('data/src/empty.txt', 'w'):
pass

Lưu ý là nếu như folder nơi chứa file rỗng cần tạo không tồn tại, lỗi FileNotFoundError sẽ bị trả về:

with open('data/src/temp/empty.txt', 'w'):
pass
#>>FileNotFoundError : [Errno 2] No such file or directory:'data/src/temp/empty.txt'

Ghi file trong python với các mode trong hàm open()

Ghi đè file trong python | mode w

Ở phần trên, chúng ta đã sử dụng mode w trong hàm open() để ghi đè file trong python.
Mode w trong hàm open() được sử dụng với cú pháp sau:

f = open ( 'myfile.txt' , 'w' )

Nếu file được chỉ định không tồn tại, một file mới sẽ được tạo ra. Nếu file đó đã tồn tại, nội dung cũ của file bị xóa trước khi được ghi đè nội dung mới lên.

Ví dụ chúng ta có file myfile.txt có nội dung là old file và muốn ghi đè nội dung mới là new file:

path_w = 'data/src/myfile.txt'
#kiểm tra nội dung ban đầu của file
f = open(path_w)
print(f.read())

#mở file và ghi đè nội dung
f = open(path_w, 'w')
f.write('new file')

#kiểm tra nội dung đã ghi đè
f = open(path_w)
print(f.read())

f.close()

Bạn cũng có thể sử dụng với lệnh With như sau:

path_w = 'data/src/myfile.txt'

#kiểm tra nội dung ban đầu của file
with open(path_w) as f:
print(f.read())

#mở file và ghi đè nội dung
with open(path_w, mode='w') as f:
f.write('new file')

#kiểm tra nội dung đã ghi đè
with open(path_w) as f:
print(f.read())

Cả hai cách làm đều đưa ra cùng kết quả:

old file
new file

Mặc dù nếu file không tồn tại một file mới sẽ được tạo ra, nhưng nếu ngay cả folder chứa file này cũng không tồn tại, lỗi FileNotFoundError sẽ bị trả về:

with open('data/src/new_dir/myfile.txt', mode='w') as f:
f.write(s)
#FileNotFoundError: [Errno 2] No such file or directory: 'data/src/new_dir/myfile.txt'

Lại nữa, do phương pháp ghi đè file trong python bằng mode w sẽ xóa toàn bộ nội dung cũ trước khi ghi đè nội dung mới vào file, nên mặc cho mã ký tự sử dụng trong file trước khi ghi đè là gì chăng nữa, thì file sau khi ghi đè cũng sẽ có mã ký tự mới, nếu bạn chỉ định khi ghi file. Và lỗi cũng không xảy ra kể cả khi mã ký tự mới và cũ có khác nhau.

Ví dụ chúng ta có myfile.txt được viết với mã asscii. Nếu chúng ta mở file này với mã ký tự utf-8 thì lỗi cũng không xảy ra.

Ghi chèn file trong python | mode a

Ở phần trên chúng ta đã biết nếu sử dụng mode w thì chúng ta sẽ ghi đè nội dung mới lên nội dung cũ của file.
Nếu như bạn không muốn làm mất nội dung cũ mà muốn ghi chèn thêm nội dung mới vào, hãy sử dụng tới mode a khi mở file bằng hàm open().

Với mode a, nếu file được chỉ định không tồn tại, một file mới sẽ được tạo ra. Nếu file đó đã tồn tại, nội dung mới sẽ được chèn vào file bắt đầu từ vị trí cuối cùng của nội dung cũ trong file.

Cú pháp ghi chèn file trong python với mode a như sau:

open('myfile.txt', 'a')

Chúng ta cũng sử dụng phương thức write() hoặc writelines() để ghi chèn file trong python, giống như các ví dụ cụ thể sau đây:

Giả sử chúng ta có file myfile.txt có nội dung là One, và chúng ta muốn chèn thêm nội dung Two vào cuối file*

path_a = 'data/src/myfile.txt'
#kiểm tra nội dung ban đầu của file
f = open(path_a)
print(f.read())

#mở file và ghi chèn nội dung vào cuối file
f = open(path_a, 'w')
f.write('Two')

#kiểm tra nội dung đã ghi đè
f = open(path_a)
print(f.read())

f.close()

Bạn cũng có thể sử dụng với lệnh With như sau:

path_a = 'data/src/myfile.txt'

#kiểm tra nội dung ban đầu của file
with open(path_a) as f:
print(f.read())

#mở file và ghi đè nội dung
with open(path_a, mode='a') as f:
f.write('Two')

#kiểm tra nội dung đã ghi đè
with open(path_a) as f:
print(f.read())

Cả hai cách làm đều đưa ra cùng kết quả:

One
OneTwo

Nếu muốn xuống dòng khi ghi chèn nội dung, bạn cũng cần chỉ định ký tự xuống dòng khi ghi:

path_a = 'data/src/myfile.txt'
l = ['Two', 'Three']

with open(path_a, mode='a') as f:
f.write('\n'.join(l))

with open(path_a) as f:
print(f.read())

#>> OneTwo
#>> Three

Lưu ý, khác với mode w sẽ xóa toàn bộ nội dung cũ trước khi ghi đè lên, mode a là chèn nội dung mới vào nội dung cũ, do đó nếu mã ký tự của file trước và sau khi ghi nội dung khác nhau, thì khi dùng mode a, tuy lỗi không xảy ra, nhưng ký tự trong file có thể bị biến dạng khi chúng ta mở và xem file.

Tạo mới và ghi file trong python | mode x

Khác với hai mode w và mode a cũng dùng để ghi file trong python, mode x lại dùng để tạo mới và ghi nội dung vào file vừa tạo.

Nếu file được chỉ định không tồn tại, một file mới sẽ được tạo ra và được dùng để ghi file. Tuy nhiên nếu file đó đã tồn tại, do không thể tạo mới nên lỗi FileExistsError sẽ xảy ra.

Cú pháp sử dụng mode x khi ghi file trong python bằng hàm open() như sau:

f = open ( 'myfile.txt' , 'x' )

Chúng ta cũng sử dụng phương thức write() hoặc writelines() khi sử dụng mode x, giống như các ví dụ cụ thể sau đây:

path_s= 'data/src/temp/myfile.txt'
l = ['One', 'Two', 'Three']

with open(path_s, mode='x') as f:
f.writelines(l)

with open(path_s) as f:
print(f.read())

Nếu như file trên đã tồn tại trước đó, lỗi FileExistsError sẽ bị trả về:

FileExistsError: [Errno 17] File exists: 'data/src/temp/myfile.txt'

Còn nếu file trên không tồn tại trước đó, một file mới được tạo ra và nội dung file được in ra như sau:

OneTwoThree

Do khi sử dụng hàm open() để ghi file trong python với mode x, rất có khả năng là file vốn đã tồn tại trước đó dẫn đến xảy ra lỗi và ảnh hưởng tới các phần khác của chương trình.
Do đó, chúng ta nên sử dụng kèm với lệnh tryexcept để tránh lỗi này xảy ra như sau:

path_s= 'data/src/temp/myfile.txt'
l = ['One', 'Two', 'Three']

try:
with open(path_s, mode='x') as f:
f.writelines(l)
with open(path_s) as f:
print(f.read())
except FileExistsError:
pass

Ngoài tryexcept, bạn cũng có thể sử dụng tới phươg thức os.path.isfile() trong module os để kiểm tra xem file chỉ định có tồn tại hay không, trước khi dùng mode x để tránh lỗi xảy ra, như ví dụ sau đây:

import os
path_s= 'data/src/temp/myfile.txt'
l = ['One', 'Two', 'Three']

if os.path.isfile(path_s):
pass
else:
with open(path_s, mode='x') as f:
f.writelines(l)
with open(path_s) as f:
print(f.read())

Lại nữa, mặc dù khi file sẽ được tạo ra nếu nó không tồn tại trước đó, tuy nhiên nếu folder chứa file đó cũng không tồn tại từ trước, lỗi FileNotFoundError sẽ xảy ra như sau. Để giải quyết lỗi này, chúng ta cần tới câu lệnh để tạo ra một folder nếu nó không tồn tại trước đó, bằng cách sử dụng modeule os như sau:

import os
path_s= 'data/src/temp/myfile.txt'

folder_path='data/src/temp'
os.makedirs(folder_path, exist_ok=True)

l = ['One', 'Two', 'Three']

if os.path.isfile(path_s):
pass
else:
with open(path_s, mode='x') as f:
f.writelines(l)
with open(path_s) as f:
print(f.read())

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về các cách ghi file trong python rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu các kiến thức về Python trong các bài viết sau.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.