5 Cách Mở File Trong Python

Photo mình lấy từ unsplash

Python là ngôn ngữ lập trình nổi tiếng vì tính cực kỳ linh hoạt. Trong bài viết này, mình sẽ liệt kê 7 cách để đọc nội dung file sử dụng ngôn ngữ Python.

Cách 1: Sử dụng hàm open

Cách đầu tiên, cũng là cách vỡ lòng / giáo khoa/ trường lớp, là sử dụng hàm open, trả về một stream. Sau đó, chúng ta có thể sử dụng hàm read để lấy nội dung từ stream.

Ví dụ, chúng ta sẽ đọc file thegioididong.txt bằng ngôn ngữ python như sau:

1
2tgdd = open('thegioididong.txt','r')
3
4lines = tgdd.read()
5print(lines)
6
7tgdd.close()

Ưu điểm:

  • Không phải include thêm thư viện

  • Code ngắn gọn

Khuyết điểm:

  • Phải close file sau khi sử dụng xong

Cách 2: mở file sử dụng context manager

Trên stackoverflow thường khuyên chúng ta sử dụng cách này

1
2with  open('thegioididong.txt','r') as tgdd:
3
4  lines = tgdd.read()
5  print(lines)

Ưu điểm:

  • Không phải đóng file sau khi sử dụng xong

  • Ngăng ngừa memory leaks khi có lỗi trong quá trình xử lý và không gọi đóng file.

Cách 3: Sử dụng thư viện pathlib

Cách dùng cũng khá dễ, chỉ cần include thư viện vào là xài thôi

1
2import pathlib
3tgdd = pathlib.Path("thegioididong.txt")
4lines = tgdd.read_text()

Cách này cũng hay, không phải đóng mở file, chỉ cần gọi hàm đọc là được. Code thì ngắn gọn, lại không phải thò ra thụt vào như là context manager

Cách 4: Sử dụng shell

Chúng ta có thể dùng python, gọi shell script trong linux , và lấy kết quả trả về.

Để sử dụng cách này, chúng ta sử dụng thư viện subprocess

1
2import subprocess
3output = subprocess.run(["cat", "thegioididong.txt"], capture_output=True)
4lines = output.stdout.decode()

Này là một cách có thể dùng được, tuy nhiên, một số file có thể bị lỗi encode. Túm lại là không nên xài cái này

Cách 5: Xây dựng một thư viện đọc file bằng c

Để sử dụng cách này, các bạn cần phải cài bản python3-dev vào máy trước (trên ubuntu).

Ví dụ, chúng ta sẽ tạo một file mwg_file.c như sau

 1#define PY_SSIZE_T_CLEAN
 2#include <Python.h>
 3
 4
 5PyObject* mwgread(PyObject* self, PyObject* args) {
 6
 7
 8    FILE * pFile;
 9    size_t lSize;
10    char * buffer;
11    size_t result;
12
13    // Parse the Python object arguments into C variables
14    char* filename;
15    if (!PyArg_ParseTuple(args, "s", &filename)) {
16        return NULL;
17    }
18
19    // Try to open the file
20    pFile = fopen(filename, "r");
21    if (pFile == NULL) {
22        return NULL;
23    }
24
25      // obtain file size:
26    fseek (pFile , 0 , SEEK_END);
27    lSize = ftell (pFile);
28    rewind (pFile);
29
30    // allocate memory to contain the whole file:
31    buffer = (char*) malloc (sizeof(char)*lSize);
32    if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
33
34    // copy the file into the buffer:
35    result = fread (buffer,1,lSize,pFile);
36    if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
37
38    /* the whole file is now loaded in the memory buffer. */
39
40    // terminate
41    fclose (pFile);
42    return Py_BuildValue("s", buffer);
43}
44
45
46PyMethodDef module_methods[] = {
47    {"read", mwgread, METH_VARARGS, "Reads a file and returns its contents"},
48    {NULL}
49};
50
51struct PyModuleDef file_module = {
52    PyModuleDef_HEAD_INIT,
53    "MWGFile",
54    NULL,
55    -1,
56    module_methods
57};
58
59PyMODINIT_FUNC PyInit_MWGFile(void) {
60    return PyModule_Create(&file_module);
61}

Một phần code c trên mình lấy từ https://cplusplus.com/reference/cstdio/fread/

Sau đó, chúng ta sẽ tạo file setup.py, file này để chung thư mục với file .c

1
2from distutils.core import setup, Extension
3
4setup(
5    name='MWGFile',
6    ext_modules=[Extension('MWGFile', sources=['mwg_file.c'])]
7)

Cuối cùng, chúng ta gọi hàm để biên dịch file c và cài vào thư viện hệ thống

1
2python3 setup.py build
3python3 setup.py install --user

Để chạy thư viện c vừa mới biên dịch, chúng ta sử dụng lệnh sau

1
2import MWGFile
3contents = MWGFile.read_file("thegioididong.txt")
4print(contents)

Cách này khá cực, phải reimplement lại những gì cộng đồng đã làm sẵn, nhưng mà cũng nên thử để xây dựng các thư viện nội bộ của riêng mình.

Tài liệu tham khảo

https://www.w3schools.com/python/python_file_open.asp

https://betterprogramming.pub/7-ways-of-reading-a-file-in-python-855340b002dc

Comments