Kiểm tra xem đường dẫn có chứa chuỗi python không

Khi bạn nhận được một giá trị chuỗi cho một đường dẫn, bạn có thể kiểm tra xem đường dẫn đó có đại diện cho một tệp hoặc thư mục hay không bằng lập trình Python

Để kiểm tra xem đường dẫn bạn có là tệp hay thư mục, hãy nhập mô-đun os và sử dụng phương thức isfile[] để kiểm tra xem đó có phải là tệp hay không và phương thức isdir[] để kiểm tra xem đó có phải là thư mục không

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách kiểm tra xem một đường dẫn đã cho là tệp hay thư mục hay không, với sự trợ giúp của các ví dụ chi tiết

Mã mẫu

Sau đây là đoạn mã mẫu nhanh trình bày cách sử dụng các hàm isfile[] và isdir[]

import os

#checks if path is a file
isFile = os.path.isfile[fpath]

#checks if path is a directory
isDirectory = os.path.isdir[fpath]

Cả hai hàm đều trả về giá trị boolean nếu đường dẫn tệp được chỉ định có phải là tệp hay không;

ví dụ 1. Kiểm tra xem Đường dẫn có phải là Tệp không

Trong ví dụ này, hãy xem xét rằng chúng ta có một tệp được chỉ định bởi biến fpath. Chúng tôi sẽ sử dụng phương thức isfile[] để kiểm tra xem chúng tôi có thể tìm ra xem đó có phải là tệp hay không

Chương trình Python

import os

fpath = 'D:/workspace/python/samplefile.txt'
isFile = os.path.isfile[fpath]
print['The file present at the path is a regular file:', isFile]

đầu ra

The file present at the path is a regular file: True

Bây giờ chúng ta hãy thử với một đường dẫn, đó là một thư mục, được truyền dưới dạng đối số cho isfile[]

import os

fpath = 'D:/workspace/python/'
isFile = os.path.isfile[fpath]
print['The file present at the path is a regular file:', isFile]

đầu ra

The file present at the path is a regular file: False

Tốt đấy. Chúng tôi có thể nhận ra nếu đường dẫn được chỉ định là một tệp hay không

ví dụ 2. Kiểm tra xem Đường dẫn có phải là Thư mục không

Trong ví dụ sau, hãy xem xét rằng chúng ta có một thư mục hoặc thư mục được chỉ định bởi biến fpath. Chúng tôi sẽ sử dụng phương thức isdir[] để kiểm tra xem chúng tôi có thể tìm ra xem đó có phải là tệp không

Chương trình Python

import os

fpath = 'D:/workspace/python/'
isDirectory = os.path.isdir[fpath]
print['Path points to a Directory:', isDirectory]

đầu ra

Path points to a Directory: True

Bây giờ chúng ta hãy thử với một đường dẫn, đó là một tệp, được truyền dưới dạng đối số cho hàm isdir[]

Chương trình Python

import os

fpath = 'D:/workspace/python/samplefile.txt'
isDirectory = os.path.isdir[fpath]
print['Path points to a Directory:', isDirectory]

đầu ra

________số 8_______

Một lần nữa điều đó tốt. Nó nhận ra nếu đường dẫn được cung cấp là một thư mục hay không

Bản tóm tắt

Trong hướng dẫn về Ví dụ Python này, chúng ta đã học cách kiểm tra xem một đường dẫn đã cho là tệp hay thư mục trong Python, sử dụng isfile[] và isdir[], với sự trợ giúp của các ví dụ chi tiết

Mô-đun được gọi là os chứa các chức năng để lấy thông tin về các thư mục cục bộ, tệp, quy trình và biến môi trường

Thư mục làm việc hiện tại là thuộc tính mà Python luôn lưu giữ trong bộ nhớ. Luôn có một thư mục làm việc hiện tại, cho dù chúng ta đang ở trong Python Shell, chạy tập lệnh Python của riêng chúng ta từ dòng lệnh, v.v.

>>> import os
>>> print[os.getcwd[]]
C:\Python32
>>> os.chdir['/test']
>>> print[os.getcwd[]]
C:\test

Chúng tôi đã sử dụng hệ điều hành. getcwd[] để lấy thư mục làm việc hiện tại. Khi chúng tôi chạy Python Shell đồ họa, thư mục làm việc hiện tại bắt đầu là thư mục chứa tệp thực thi Python Shell. Trên Windows, điều này phụ thuộc vào nơi chúng tôi đã cài đặt Python; . \Python32. Nếu chúng ta chạy Python Shell từ dòng lệnh, thư mục làm việc hiện tại sẽ bắt đầu như thư mục chúng ta đã ở khi chạy python3

Sau đó, chúng tôi đã sử dụng hệ điều hành. chức năng chdir[] để thay đổi thư mục làm việc hiện tại. Lưu ý rằng khi chúng tôi gọi hệ điều hành. chdir[], chúng tôi đã sử dụng tên đường dẫn kiểu Linux [dấu gạch chéo về phía trước, không có ký tự ổ đĩa] mặc dù chúng tôi đang sử dụng Windows. Đây là một trong những nơi Python cố gắng khắc phục sự khác biệt giữa các hệ điều hành

hệ điều hành. đường dẫn chứa các chức năng để thao tác tên tệp và tên thư mục

>>> import os
>>> print[os.path.join['/test/', 'myfile']]
/test/myfile
>>> print[os.path.expanduser['~']]
C:\Users\K
>>> print[os.path.join[os.path.expanduser['~'],'dir', 'subdir', 'k.py']]
C:\Users\K\dir\subdir\k.py

hệ điều hành. con đường. hàm join[] xây dựng một tên đường dẫn từ một hoặc nhiều tên đường dẫn một phần. Trong trường hợp này, nó chỉ đơn giản là nối chuỗi. gọi hệ điều hành. con đường. hàm join[] sẽ thêm một dấu gạch chéo vào tên đường dẫn trước khi nối nó với tên tệp

hệ điều hành. con đường. expanduser[] sẽ mở rộng tên đường dẫn sử dụng ~ để biểu thị thư mục chính của người dùng hiện tại. Điều này hoạt động trên bất kỳ nền tảng nào mà người dùng có thư mục chính, bao gồm Linux, Mac OS X và Windows. Đường dẫn trả về không có dấu gạch chéo, nhưng hệ điều hành. con đường. chức năng tham gia [] không bận tâm

Kết hợp các kỹ thuật này, chúng ta có thể dễ dàng xây dựng tên đường dẫn cho các thư mục và tệp trong thư mục chính của người dùng. hệ điều hành. con đường. hàm join[] có thể nhận bất kỳ số lượng đối số nào

Ghi chú. chúng ta cần cẩn thận về chuỗi khi sử dụng os. con đường. tham gia. Nếu chúng ta sử dụng "/", nó sẽ cho Python biết rằng chúng ta đang sử dụng đường dẫn tuyệt đối và nó sẽ ghi đè lên đường dẫn trước nó

>>> import os
>>> print[os.path.join['/test/', '/myfile']]
/myfile

Như chúng ta có thể thấy đường dẫn "/test/" đã biến mất

hệ điều hành. đường dẫn cũng chứa các hàm để chia tên đường dẫn đầy đủ, tên thư mục và tên tệp thành các phần cấu thành của chúng

>>> pathname = "/Users/K/dir/subdir/k.py"
>>> os.path.split[pathname]
['/Users/K/dir/subdir', 'k.py']
>>> [dirname, filename] = os.path.split[pathname]
>>> dirname
'/Users/K/dir/subdir'
>>> pathname
'/Users/K/dir/subdir/k.py'
>>> filename
'k.py'
>>> [shortname, extension] = os.path.splitext[filename]
>>> shortname
'k'
>>> extension
'.py'

Hàm split[] chia một tên đường dẫn đầy đủ và trả về một bộ chứa đường dẫn và tên tệp. hệ điều hành. con đường. hàm split[] trả về nhiều giá trị. Chúng ta gán giá trị trả về của hàm tách thành một bộ gồm hai biến. Mỗi biến nhận giá trị của phần tử tương ứng của bộ trả về. Biến đầu tiên, dirname, nhận giá trị của phần tử đầu tiên của bộ được trả về từ os. con đường. split[], đường dẫn tệp. Biến thứ hai, tên tệp, nhận giá trị của phần tử thứ hai của bộ được trả về từ os. con đường. hàm split[], tên tệp

hệ điều hành. đường dẫn cũng chứa hệ điều hành. con đường. splitext[] tách tên tệp và trả về một bộ chứa tên tệp và phần mở rộng tệp. Chúng tôi đã sử dụng cùng một kỹ thuật để gán từng biến cho các biến riêng biệt

Mô-đun toàn cầu là một công cụ khác trong thư viện chuẩn Python. Đó là một cách dễ dàng để lấy nội dung của một thư mục theo chương trình và nó sử dụng loại ký tự đại diện mà chúng ta có thể đã quen thuộc khi làm việc trên dòng lệnh

>>> import glob
>>> os.chdir['/test']
>>> import glob
>>> glob.glob['subdir/*.py']
['subdir\\tes3.py', 'subdir\\test1.py', 'subdir\\test2.py']

Mô-đun toàn cầu lấy ký tự đại diện và trả về đường dẫn của tất cả các tệp và thư mục khớp với ký tự đại diện

Mọi hệ thống tệp đều lưu trữ siêu dữ liệu về từng tệp. ngày tạo, ngày sửa đổi lần cuối, kích thước tệp, v.v. Python cung cấp một API duy nhất để truy cập siêu dữ liệu này. Chúng tôi không cần mở tệp và tất cả những gì chúng tôi cần là tên tệp

>>> import os
>>> print[os.getcwd[]]
C:\test
>>> os.chdir['subdir']
>>> print[os.getcwd[]]
C:\test\subdir
>>> metadata = os.stat['test1.py']
>>> metadata.st_mtime
1359868355.9555483
>>> import time
>>> time.localtime[metadata.st_mtime]
time.struct_time[tm_year=2013, tm_mon=2, tm_mday=2, tm_hour=21, 
tm_min=12, tm_sec=35, tm_wday=5, tm_yday=33, tm_isdst=0]
>>> metadata.st_size
1844

gọi hệ điều hành. hàm stat[] trả về một đối tượng chứa một số loại siêu dữ liệu khác nhau về tệp. st_mtime là thời gian sửa đổi, nhưng nó ở định dạng không hữu ích lắm. Trên thực tế, đó là số giây kể từ Kỷ nguyên, được định nghĩa là giây đầu tiên của ngày 1 tháng 1 năm 1970

Mô-đun thời gian là một phần của thư viện chuẩn Python. Nó chứa các hàm để chuyển đổi giữa các biểu diễn thời gian khác nhau, định dạng giá trị thời gian thành chuỗi và sử dụng múi giờ

Thời gian. localtime[] chuyển đổi một giá trị thời gian từ seconds-since-the-Epoch [từ thuộc tính st_mtime được trả về từ hàm os. stat[]] thành một cấu trúc hữu ích hơn của năm, tháng, ngày, giờ, phút, giây, v.v. Tệp này được sửa đổi lần cuối vào ngày 2 tháng 2 năm 2013, vào khoảng 9. 12 giờ trưa

hệ điều hành. Hàm stat[] cũng trả về kích thước của tệp, trong thuộc tính st_size. Tập tin "test1. py" là 1844 byte

hệ điều hành. con đường. realpath[] - Tên đường dẫn tuyệt đối

quả địa cầu. hàm glob[] trả về danh sách tên đường dẫn tương đối. Nếu chúng ta muốn xây dựng một tên đường dẫn tuyệt đối - tôi. e. một bao gồm tất cả các tên thư mục trở lại thư mục gốc hoặc ký tự ổ đĩa - sau đó chúng tôi sẽ cần hệ điều hành. con đường. hàm realpath[]

>>> import os
>>> print[os.getcwd[]]
C:\test\subdir
>>> print[os.path.realpath['test1.py']]
C:\test\subdir\test1.py

hệ điều hành. con đường. expandvars[] - Env. Biến đổi

Hàm expandvars chèn biến môi trường vào tên tệp

>>> import os
>>> os.environ['SUBDIR'] = 'subdir'
>>> print[os.path.expandvars['/home/users/K/$SUBDIR']]
/home/users/K/subdir

Để mở một tập tin, chúng ta sử dụng hàm open[] tích hợp sẵn

myfile = open['mydir/myfile.txt', 'w']

Hàm open[] lấy tên tệp làm đối số. Ở đây tên tệp là mydir/myfile. txt và đối số tiếp theo là chế độ xử lý. Chế độ thường là chuỗi ký tự 'r' để mở nhập văn bản [đây là chế độ mặc định], 'w' để tạo và mở open cho xuất văn bản. Chuỗi 'a' là để mở để nối thêm văn bản vào cuối. Đối số chế độ có thể chỉ định các tùy chọn bổ sung. thêm 'b' vào chuỗi chế độ cho phép dữ liệu nhị phân và thêm + mở tệp cho cả đầu vào và đầu ra

Bảng dưới đây liệt kê một số kết hợp của các chế độ xử lý


ModeDescriptionrMở một tệp chỉ để đọc. Con trỏ tệp được đặt ở đầu tệp. Đây là chế độ mặc định. rbMở một tệp chỉ để đọc ở định dạng nhị phân. Con trỏ tệp được đặt ở đầu tệp. Đây là chế độ mặc định. r+Mở tệp cho cả đọc và ghi. Con trỏ tệp sẽ ở đầu tệp. rb+Mở tệp cho cả đọc và ghi ở định dạng nhị phân. Con trỏ tệp sẽ ở đầu tệp. wMở một tập tin chỉ để viết. Ghi đè tệp nếu tệp tồn tại. Nếu tệp không tồn tại, hãy tạo một tệp mới để ghi. wbMở một tệp chỉ để ghi ở định dạng nhị phân. Ghi đè tệp nếu tệp tồn tại. Nếu tệp không tồn tại, hãy tạo một tệp mới để ghi. w+Mở tệp cho cả viết và đọc. Ghi đè lên tệp hiện có nếu tệp tồn tại. Nếu tệp không tồn tại, hãy tạo một tệp mới để đọc và ghi. aMở tệp để nối thêm. Con trỏ tệp ở cuối tệp nếu tệp tồn tại. Tức là tệp đang ở chế độ chắp thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để ghi. abMở tệp để nối thêm ở định dạng nhị phân. Con trỏ tệp ở cuối tệp nếu tệp tồn tại. Tức là tệp đang ở chế độ chắp thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để ghi. a+Mở tệp cho cả việc nối thêm và đọc. Con trỏ tệp ở cuối tệp nếu tệp tồn tại. Tệp mở ở chế độ chắp thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để đọc và ghi. ab+Mở tệp cho cả việc nối thêm và đọc ở định dạng nhị phân. Con trỏ tệp ở cuối tệp nếu tệp tồn tại. Tệp mở ở chế độ chắp thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để đọc và ghi

Có những điều chúng ta nên biết về tên tệp

  1. Nó không chỉ là tên của một tập tin. Đó là sự kết hợp giữa đường dẫn thư mục và tên tệp. Trong Python, bất cứ khi nào chúng ta cần một tên tệp, chúng ta cũng có thể bao gồm một số hoặc tất cả đường dẫn thư mục

  2. Đường dẫn thư mục sử dụng dấu gạch chéo lên mà không đề cập đến hệ điều hành. Windows sử dụng dấu gạch chéo ngược để biểu thị các thư mục con, trong khi Linux sử dụng dấu gạch chéo xuôi. Nhưng trong Python, dấu gạch chéo về phía trước luôn hoạt động, ngay cả trên Windows

  3. Đường dẫn thư mục không bắt đầu bằng dấu gạch chéo hay ký tự ổ đĩa nên được gọi là đường dẫn tương đối

  4. Đó là một chuỗi. Tất cả các hệ điều hành hiện đại đều sử dụng Unicode để lưu trữ tên của tệp và thư mục. Python 3 hỗ trợ đầy đủ tên đường dẫn không phải ASCII

Một chuỗi là một dãy các ký tự Unicode. Tệp trên đĩa không phải là một chuỗi ký tự Unicode mà là một chuỗi byte. Vì vậy, nếu chúng ta đọc một tệp từ đĩa, Python sẽ chuyển đổi chuỗi byte đó thành một chuỗi ký tự như thế nào?
Bên trong, Python giải mã các byte theo thuật toán mã hóa ký tự cụ thể và trả về một chuỗi ký tự Unicode

Tôi có một tập tin ['Một mình. txt']

나 혼자 [Alone] - By Sistar
추억이 이리 많을까 넌 대체 뭐할까
아직 난 이래 혹시 돌아 올까 봐

Hãy thử đọc tập tin

>>> import os
>>> print[os.path.join['/test/', 'myfile']]
/test/myfile
>>> print[os.path.expanduser['~']]
C:\Users\K
>>> print[os.path.join[os.path.expanduser['~'],'dir', 'subdir', 'k.py']]
C:\Users\K\dir\subdir\k.py
0

Điều gì vừa xảy ra?
Chúng tôi không chỉ định mã hóa ký tự, vì vậy Python buộc phải sử dụng mã hóa mặc định
Mã hóa mặc định là gì? . py, nghĩa là Python đang sử dụng CP-1252 làm mã hóa mặc định tại đây. [CP-1252 là mã hóa phổ biến trên các máy tính chạy Microsoft Windows. ] Bộ ký tự CP-1252 không hỗ trợ các ký tự trong tệp này, vì vậy việc đọc không thành công với UnicodeDecodeError

Trên thực tế, khi tôi hiển thị ký tự tiếng Hàn, tôi phải đặt các dòng html sau vào phần tiêu đề

>>> import os
>>> print[os.path.join['/test/', 'myfile']]
/test/myfile
>>> print[os.path.expanduser['~']]
C:\Users\K
>>> print[os.path.join[os.path.expanduser['~'],'dir', 'subdir', 'k.py']]
C:\Users\K\dir\subdir\k.py
1

Có bảng mã ký tự cho từng ngôn ngữ chính trên thế giới. Vì mỗi ngôn ngữ là khác nhau, bộ nhớ và dung lượng đĩa trước đây rất đắt, nên mỗi mã hóa ký tự được tối ưu hóa cho một ngôn ngữ cụ thể. Mỗi mã hóa sử dụng các số giống nhau [0-255] để biểu thị các ký tự của ngôn ngữ đó. Chẳng hạn, mã hóa ASCII, lưu trữ các ký tự tiếng Anh dưới dạng các số từ 0 đến 127. [65 là A viết hoa, 97 là a viết thường]. Tiếng Anh có bảng chữ cái vô cùng đơn giản nên hoàn toàn có thể diễn đạt trong chưa đầy 128 con số

Các ngôn ngữ Tây Âu như tiếng Pháp, tiếng Tây Ban Nha và tiếng Đức có nhiều chữ cái hơn tiếng Anh. Mã hóa phổ biến nhất cho các ngôn ngữ này là CP-1252. Mã hóa CP-1252 chia sẻ các ký tự với ASCII trong phạm vi 0-127, nhưng sau đó mở rộng sang phạm vi 128-255 cho các ký tự như ñ, ü, v.v. Tuy nhiên, nó vẫn là mã hóa một byte;

Sau đó, có những ngôn ngữ như tiếng Trung và tiếng Hàn, có nhiều ký tự đến mức chúng yêu cầu bộ ký tự nhiều byte. Nghĩa là, mỗi ký tự được biểu thị bằng một số hai byte [0-65535]. Nhưng các mã hóa nhiều byte khác nhau vẫn chia sẻ cùng một vấn đề như các mã hóa một byte khác nhau, đó là mỗi mã hóa sử dụng cùng một số để có nghĩa là những thứ khác nhau. Chỉ là phạm vi của các số rộng hơn, vì có nhiều ký tự hơn để biểu thị

Unicode được thiết kế để đại diện cho mọi ký tự từ mọi ngôn ngữ. Unicode đại diện cho mỗi chữ cái, ký tự hoặc chữ tượng hình dưới dạng số 4 byte. Mỗi số đại diện cho một ký tự duy nhất được sử dụng trong ít nhất một trong các ngôn ngữ trên thế giới. Có đúng 1 số trên mỗi ký tự và đúng 1 ký tự trên mỗi số. Mỗi con số luôn chỉ có nghĩa là một thứ; . U+0061 luôn là 'a', ngay cả khi một ngôn ngữ không có 'a' trong đó

Đây có vẻ là một ý tưởng tuyệt vời. Một mã hóa để cai trị tất cả. Nhiều ngôn ngữ cho mỗi tài liệu. Không còn chế độ chuyển đổi để chuyển đổi giữa các mã hóa giữa luồng. Nhưng Bốn byte cho mỗi ký tự?

Có một mã hóa Unicode sử dụng bốn byte cho mỗi ký tự. Nó được gọi là UTF-32, vì 32 bit = 4 byte. UTF-32 là một mã hóa đơn giản; . Điều này có một số lợi thế, điều quan trọng nhất là chúng ta có thể tìm thấy ký tự thứ N của một chuỗi trong thời gian không đổi, bởi vì ký tự thứ N bắt đầu ở byte thứ 4xN. Nó cũng có một số nhược điểm, rõ ràng nhất là phải mất bốn byte để lưu trữ mọi ký tự kỳ dị.

Mặc dù có rất nhiều ký tự Unicode, hóa ra hầu hết mọi người sẽ không bao giờ sử dụng bất kỳ thứ gì ngoài 65535 đầu tiên. Như vậy, có một bảng mã Unicode khác, được gọi là UTF-16 [vì 16 bit = 2 byte]. UTF-16 mã hóa mọi ký tự từ 0-65535 thành hai byte, sau đó sử dụng một số thủ thuật bẩn nếu chúng ta thực sự cần biểu thị các ký tự Unicode hiếm khi được sử dụng ngoài 65535. Lợi thế rõ ràng nhất. UTF-16 tiết kiệm không gian gấp đôi so với UTF-32, bởi vì mỗi ký tự chỉ yêu cầu hai byte để lưu trữ thay vì bốn byte. Và chúng ta vẫn có thể dễ dàng tìm được ký tự thứ N của một chuỗi trong thời gian không đổi

Nhưng cũng có những nhược điểm không rõ ràng đối với cả UTF-32 và UTF-16. Các hệ thống máy tính khác nhau lưu trữ các byte riêng lẻ theo những cách khác nhau. Điều đó có nghĩa là ký tự U+4E2D có thể được lưu trữ trong UTF-16 dưới dạng 4E 2D hoặc 2D 4E, tùy thuộc vào việc hệ thống là big-endian hay little-endian. [Đối với UTF-32, thậm chí còn có nhiều thứ tự byte khả thi hơn. ]

Để giải quyết vấn đề này, mã hóa Unicode nhiều byte xác định Dấu thứ tự byte, là một ký tự đặc biệt không in được mà chúng ta có thể đưa vào ở đầu tài liệu để cho biết thứ tự các byte của chúng ta. Đối với UTF-16, Dấu thứ tự byte là U+FEFF. Nếu chúng tôi nhận được tài liệu UTF-16 bắt đầu bằng byte FF FE, chúng tôi biết thứ tự byte là một chiều;

Tuy nhiên, UTF-16 không thực sự lý tưởng, đặc biệt nếu chúng ta đang xử lý nhiều ký tự ASCII. Nếu chúng ta nghĩ về nó, ngay cả một trang web tiếng Trung cũng sẽ chứa rất nhiều ký tự ASCII - tất cả các thành phần và thuộc tính xung quanh các ký tự tiếng Trung có thể in được. Có thể tìm thấy ký tự thứ N trong thời gian không đổi là điều tốt, nhưng chúng tôi không thể đảm bảo rằng mỗi ký tự chính xác là hai byte, vì vậy chúng tôi thực sự không thể tìm thấy ký tự thứ N trong thời gian không đổi trừ khi chúng tôi duy trì một chỉ mục riêng

UTF-8 là hệ thống mã hóa có độ dài thay đổi cho Unicode. Nghĩa là, các ký tự khác nhau chiếm một số byte khác nhau. Đối với các ký tự ASCII [A-Z] UTF-8 chỉ sử dụng một byte cho mỗi ký tự. Trên thực tế, nó sử dụng chính xác các byte giống nhau; . Các ký tự Latinh mở rộng như ñ và ü chiếm hai byte. [Các byte không chỉ đơn giản là điểm mã Unicode giống như trong UTF-16; có một số thay đổi bit nghiêm trọng liên quan. ] Các ký tự tiếng Trung như ç chiếm ba byte. Các ký tự cõi trung giới hiếm khi được sử dụng chiếm bốn byte

Nhược điểm. bởi vì mỗi ký tự có thể chiếm một số byte khác nhau, việc tìm ký tự thứ N là thao tác O[N] - nghĩa là chuỗi càng dài thì càng mất nhiều thời gian để tìm một ký tự cụ thể. Ngoài ra, có liên quan đến việc xoay bit để mã hóa các ký tự thành byte và giải mã byte thành ký tự

Thuận lợi. mã hóa siêu hiệu quả các ký tự ASCII phổ biến. Không tệ hơn UTF-16 đối với các ký tự Latinh mở rộng. Tốt hơn UTF-32 cho các ký tự tiếng Trung. Ngoài ra, không có vấn đề về thứ tự byte. Một tài liệu được mã hóa bằng utf-8 sử dụng chính xác cùng một luồng byte trên bất kỳ máy tính nào

Hàm open[] trả về một đối tượng tệp, có các phương thức và thuộc tính để nhận thông tin và thao tác với một luồng ký tự

>>> import os
>>> print[os.path.join['/test/', 'myfile']]
/test/myfile
>>> print[os.path.expanduser['~']]
C:\Users\K
>>> print[os.path.join[os.path.expanduser['~'],'dir', 'subdir', 'k.py']]
C:\Users\K\dir\subdir\k.py
2

Nếu chúng ta chỉ định mã hóa

>>> import os
>>> print[os.path.join['/test/', 'myfile']]
/test/myfile
>>> print[os.path.expanduser['~']]
C:\Users\K
>>> print[os.path.join[os.path.expanduser['~'],'dir', 'subdir', 'k.py']]
C:\Users\K\dir\subdir\k.py
3

Dòng đầu tiên là khai báo mã hóa cần thiết để làm cho Python biết tiếng Hàn

Thuộc tính name phản ánh tên mà chúng ta đã truyền vào hàm open[] khi chúng ta mở tệp. Thuộc tính mã hóa phản ánh mã hóa mà chúng tôi đã chuyển vào hàm open[]. Nếu chúng tôi không chỉ định mã hóa khi chúng tôi mở tệp, thì thuộc tính mã hóa sẽ phản ánh ngôn ngữ. getpreferredencoding[]. Thuộc tính mode cho chúng ta biết tệp được mở ở chế độ nào. Chúng ta có thể truyền tham số chế độ tùy chọn cho hàm open[]. Chúng tôi đã không chỉ định chế độ khi mở tệp này, vì vậy Python mặc định là 'r', có nghĩa là chỉ mở để đọc, ở chế độ văn bản. Chế độ tệp phục vụ một số mục đích;

>>> import os
>>> print[os.path.join['/test/', 'myfile']]
/test/myfile
>>> print[os.path.expanduser['~']]
C:\Users\K
>>> print[os.path.join[os.path.expanduser['~'],'dir', 'subdir', 'k.py']]
C:\Users\K\dir\subdir\k.py
4

Đọc lại tệp không phát sinh ngoại lệ. Python không coi việc đọc phần cuối của tệp là một lỗi;

>>> import os
>>> print[os.path.join['/test/', 'myfile']]
/test/myfile
>>> print[os.path.expanduser['~']]
C:\Users\K
>>> print[os.path.join[os.path.expanduser['~'],'dir', 'subdir', 'k.py']]
C:\Users\K\dir\subdir\k.py
5

Vì chúng ta vẫn đang ở cuối tệp, nên các cuộc gọi tiếp theo đến phương thức read[] của đối tượng luồng chỉ cần trả về một chuỗi rỗng

>>> import os
>>> print[os.path.join['/test/', 'myfile']]
/test/myfile
>>> print[os.path.expanduser['~']]
C:\Users\K
>>> print[os.path.join[os.path.expanduser['~'],'dir', 'subdir', 'k.py']]
C:\Users\K\dir\subdir\k.py
6

Phương thức seek[] di chuyển đến một vị trí byte cụ thể trong một tệp

>>> import os
>>> print[os.path.join['/test/', 'myfile']]
/test/myfile
>>> print[os.path.expanduser['~']]
C:\Users\K
>>> print[os.path.join[os.path.expanduser['~'],'dir', 'subdir', 'k.py']]
C:\Users\K\dir\subdir\k.py
7

Phương thức read[] có thể nhận tham số tùy chọn là số lượng ký tự cần đọc. Chúng ta cũng có thể đọc một ký tự tại một thời điểm. Các phương thức seek[] và tell[] luôn tính byte, nhưng vì chúng tôi đã mở tệp này dưới dạng văn bản, nên phương thức read[] đếm các ký tự. Các ký tự tiếng Hàn yêu cầu nhiều byte để mã hóa theo UTF-8. Các ký tự tiếng Anh trong tệp chỉ yêu cầu một byte mỗi ký tự, vì vậy chúng ta có thể nhầm tưởng rằng các phương thức seek[] và read[] đang đếm cùng một thứ. Nhưng điều đó chỉ đúng với một số nhân vật

Điều quan trọng là phải đóng các tệp ngay khi chúng tôi hoàn thành chúng vì các tệp đang mở sẽ tiêu tốn tài nguyên hệ thống và tùy thuộc vào chế độ tệp, các chương trình khác có thể không truy cập được chúng

>>> import os
>>> print[os.path.join['/test/', 'myfile']]
/test/myfile
>>> print[os.path.expanduser['~']]
C:\Users\K
>>> print[os.path.join[os.path.expanduser['~'],'dir', 'subdir', 'k.py']]
C:\Users\K\dir\subdir\k.py
8
  1. Chúng tôi không thể đọc từ một tệp đã đóng;

  2. Chúng tôi cũng không thể tìm kiếm trong một tệp đã đóng

  3. Không có vị trí hiện tại trong một tệp đã đóng, vì vậy phương thức Tell[] cũng không thành công

  4. Gọi phương thức close[] trên đối tượng luồng có tệp đã bị đóng không gây ra ngoại lệ. nó chỉ là một no-op

  5. Các đối tượng luồng đã đóng có một thuộc tính hữu ích. thuộc tính đã đóng sẽ xác nhận rằng tệp đã được đóng

Các đối tượng luồng có một phương thức close[] rõ ràng, nhưng điều gì sẽ xảy ra nếu mã của chúng tôi có lỗi và gặp sự cố trước khi chúng tôi gọi close[]?

Có lẽ, chúng ta có thể sử dụng thử. cuối cùng chặn. Nhưng chúng tôi có một giải pháp sạch hơn, hiện là giải pháp được ưu tiên trong Python 3. với tuyên bố

>>> import os
>>> print[os.path.join['/test/', 'myfile']]
/test/myfile
>>> print[os.path.expanduser['~']]
C:\Users\K
>>> print[os.path.join[os.path.expanduser['~'],'dir', 'subdir', 'k.py']]
C:\Users\K\dir\subdir\k.py
9

Đoạn mã trên không bao giờ gọi tệp. đóng[]. Câu lệnh with bắt đầu một khối mã, như câu lệnh if hoặc vòng lặp for. Bên trong khối mã này, chúng ta có thể sử dụng tệp biến làm đối tượng luồng được trả về từ lệnh gọi open[]. Tất cả các phương thức đối tượng luồng thông thường đều có sẵn - seek[], read[], bất cứ thứ gì chúng ta cần. Khi khối with kết thúc, Python gọi tệp. đóng [] tự động

Lưu ý rằng bất kể chúng ta thoát khỏi khối with bằng cách nào hoặc khi nào, Python sẽ đóng tệp đó ngay cả khi chúng ta thoát khỏi nó thông qua một ngoại lệ chưa được xử lý. Nói cách khác, ngay cả khi mã của chúng tôi đưa ra một ngoại lệ và toàn bộ chương trình của chúng tôi dừng lại, thì tệp đó sẽ bị đóng. đảm bảo

Trên thực tế, câu lệnh with tạo bối cảnh thời gian chạy. Trong các ví dụ này, đối tượng luồng hoạt động như một trình quản lý ngữ cảnh. Python tạo tệp đối tượng luồng và báo cho nó biết rằng nó đang vào ngữ cảnh thời gian chạy. Khi hoàn thành khối mã with, Python sẽ thông báo cho đối tượng luồng rằng nó đang thoát khỏi bối cảnh thời gian chạy và đối tượng luồng gọi phương thức close[] của chính nó

Không có tệp cụ thể nào về câu lệnh with; . Nếu đối tượng được đề cập là đối tượng luồng, thì nó sẽ tự động đóng tệp. Nhưng hành vi đó được xác định trong đối tượng luồng, không phải trong câu lệnh with. Có rất nhiều cách khác để sử dụng trình quản lý bối cảnh không liên quan gì đến tệp

Một dòng văn bản là một chuỗi các ký tự được phân định chính xác bởi cái gì? . Mỗi hệ điều hành có quy ước riêng. Một số sử dụng ký tự xuống dòng [\r], một số khác sử dụng ký tự xuống dòng [\n] và một số sử dụng cả hai ký tự [\r\n] ở cuối mỗi dòng

Tuy nhiên, Python tự động xử lý kết thúc dòng theo mặc định. Python sẽ tìm ra loại dòng kết thúc mà tệp văn bản sử dụng và tất cả sẽ hoạt động với chúng tôi

>>> import os
>>> print[os.path.join['/test/', '/myfile']]
/myfile
0

Nếu chúng ta chạy nó

>>> import os
>>> print[os.path.join['/test/', '/myfile']]
/myfile
1
  1. Sử dụng mẫu with, chúng tôi mở tệp một cách an toàn và để Python đóng tệp cho chúng tôi

  2. Để đọc tệp một dòng tại một thời điểm, hãy sử dụng vòng lặp for. Đó là nó. Bên cạnh việc có các phương thức rõ ràng như read[], đối tượng luồng cũng là một trình lặp tạo ra một dòng mỗi khi chúng tôi yêu cầu một giá trị

  3. Sử dụng phương thức chuỗi format[], chúng ta có thể in ra số dòng và chính dòng đó. Trình xác định định dạng {. >> import os >>> print[os.path.join['/test/', '/myfile']] /myfile 2

    Chúng tôi bắt đầu bằng cách tạo tệp mới myfile và mở tệp để ghi. Tham số mode='w' có nghĩa là mở tệp để ghi. Chúng ta có thể thêm dữ liệu vào tệp mới mở bằng phương thức write[] của đối tượng tệp được trả về bởi hàm open[]. Sau khi khối with kết thúc, Python tự động đóng tệp

    Sau đó, với mode='a' để thêm vào tệp thay vì ghi đè lên tệp. Việc thêm vào sẽ không bao giờ gây hại cho nội dung hiện có của tệp. Cả dòng ban đầu chúng tôi đã viết và dòng thứ hai chúng tôi thêm vào đều có trong tệp. Cũng lưu ý rằng không bao gồm trả lại vận chuyển cũng như nguồn cấp dữ liệu dòng. Lưu ý rằng chúng tôi đã viết một nguồn cấp dữ liệu có ký tự '\n'

    Tệp ảnh không phải là tệp văn bản. Các tệp nhị phân có thể chứa bất kỳ loại dữ liệu nào, được mã hóa ở dạng nhị phân cho mục đích lưu trữ và xử lý máy tính

    Các tệp nhị phân thường được coi là một chuỗi byte, có nghĩa là các chữ số nhị phân [bit] được nhóm thành tám. Các tệp nhị phân thường chứa các byte được hiểu là thứ gì đó không phải là ký tự văn bản. Các chương trình máy tính biên dịch là những ví dụ điển hình; . Nhưng các tệp nhị phân cũng có thể chứa hình ảnh, âm thanh, phiên bản nén của các tệp khác, v.v. - tóm lại, bất kỳ loại nội dung tệp nào
    Một số tệp nhị phân chứa tiêu đề, khối siêu dữ liệu được chương trình máy tính sử dụng để diễn giải dữ liệu trong tệp. Ví dụ: tệp GIF có thể chứa nhiều hình ảnh và các tiêu đề được sử dụng để xác định và mô tả từng khối dữ liệu hình ảnh. Nếu tệp nhị phân không chứa bất kỳ tiêu đề nào, nó có thể được gọi là tệp nhị phân phẳng. Nhưng sự hiện diện của các tiêu đề cũng phổ biến trong các tệp văn bản thuần túy, như tệp email và tệp html. - wiki

    >>> import os
    >>> print[os.path.join['/test/', '/myfile']]
    /myfile
    
    3

    Mở tệp ở chế độ nhị phân đơn giản nhưng tinh tế. Sự khác biệt duy nhất khi mở nó ở chế độ văn bản là tham số chế độ chứa ký tự 'b'. Đối tượng luồng mà chúng ta nhận được từ việc mở tệp ở chế độ nhị phân có nhiều thuộc tính giống nhau, bao gồm cả chế độ, phản ánh tham số chế độ mà chúng ta đã chuyển vào hàm open[]. Đối tượng tệp nhị phân cũng có thuộc tính tên, giống như đối tượng tệp văn bản

    Tuy nhiên, một đối tượng dòng nhị phân không có thuộc tính mã hóa. Đó là bởi vì chúng tôi đang đọc byte, không phải chuỗi, vì vậy Python không thực hiện chuyển đổi nào

    Hãy tiếp tục điều tra thêm về hệ nhị phân

    >>> import os
    >>> print[os.path.join['/test/', '/myfile']]
    /myfile
    
    4

    Giống như tệp văn bản, chúng ta có thể đọc từng tệp nhị phân một chút. Như đã đề cập trước đây, có một sự khác biệt quan trọng. Chúng tôi đang đọc byte, không phải chuỗi. Vì chúng tôi đã mở tệp ở chế độ nhị phân, nên phương thức read[] sẽ lấy số byte để đọc chứ không phải số ký tự

    Điều đó có nghĩa là không bao giờ có sự không phù hợp ngoài mong muốn giữa số mà chúng tôi đã truyền vào phương thức read[] và chỉ số vị trí mà chúng tôi nhận được từ phương thức Tell[]. Phương thức read[] đọc byte và phương thức seek[] và tell[] theo dõi số lượng byte đã đọc

    Chúng ta có thể đọc một đối tượng luồng bằng phương thức read[] nhận tham số kích thước tùy chọn. Sau đó, phương thức read[] trả về một chuỗi có kích thước đó. Khi được gọi mà không có tham số kích thước, phương thức read[] sẽ đọc mọi thứ ở đó và trả về tất cả dữ liệu dưới dạng một giá trị. Khi được gọi với tham số kích thước, nó sẽ đọc bao nhiêu từ nguồn đầu vào và trả về bấy nhiêu dữ liệu. Khi được gọi lại, nó tiếp tục ở nơi nó dừng lại và trả về đoạn dữ liệu tiếp theo

    >>> import os
    >>> print[os.path.join['/test/', '/myfile']]
    /myfile
    
    5

    Mô-đun io định nghĩa lớp StringIO mà chúng ta có thể sử dụng để xử lý một chuỗi trong bộ nhớ dưới dạng tệp. Để tạo một đối tượng luồng từ một chuỗi, hãy tạo một thể hiện của io. StringIO[] và truyền cho nó chuỗi mà chúng ta muốn sử dụng làm dữ liệu tệp của mình. Bây giờ chúng ta có một đối tượng luồng và chúng ta có thể thực hiện mọi thứ giống như luồng với nó

    Gọi phương thức read[] đọc toàn bộ tệp, trong trường hợp đối tượng StringIO chỉ trả về chuỗi gốc

    Chúng ta có thể tìm kiếm một cách rõ ràng đến đầu chuỗi, giống như tìm kiếm thông qua một tệp thực, bằng cách sử dụng phương thức seek[] của đối tượng StringIO. Chúng ta cũng có thể đọc chuỗi theo từng đoạn bằng cách chuyển tham số kích thước cho phương thức read[]

    Thư viện chuẩn Python chứa các module hỗ trợ đọc ghi file nén. Có một số lược đồ nén khác nhau. Hai phổ biến nhất trên các hệ thống không phải Windows là gzip và bzip2

    Mặc dù nó phụ thuộc vào ứng dụng dự định. gzip rất nhanh và có dung lượng bộ nhớ nhỏ. bzip2 không thể cạnh tranh với gzip về tốc độ hoặc mức sử dụng bộ nhớ. bzip2 có tỷ lệ nén tốt hơn đáng kể so với gzip, đây là lý do khiến bzip2 trở nên phổ biến;


    Dữ liệu từ gzip so với bzip2

    Mô-đun gzip cho phép chúng tôi tạo đối tượng luồng để đọc hoặc ghi tệp nén gzip. Đối tượng luồng nó cung cấp cho chúng ta hỗ trợ phương thức read[] nếu chúng ta mở nó để đọc hoặc phương thức write[] nếu chúng ta mở nó để ghi. Điều đó có nghĩa là chúng ta có thể sử dụng các phương pháp mà chúng ta đã học đối với các tệp thông thường để đọc hoặc ghi trực tiếp tệp nén gzip mà không cần tạo tệp tạm thời để lưu trữ dữ liệu đã giải nén

    >>> import os
    >>> print[os.path.join['/test/', '/myfile']]
    /myfile
    
    6

    Chúng ta phải luôn mở các tệp được nén ở chế độ nhị phân. [Lưu ý ký tự 'b' trong đối số chế độ. ] Định dạng tệp gzip bao gồm một tiêu đề có độ dài cố định chứa một số siêu dữ liệu về tệp, vì vậy nó không hiệu quả đối với các tệp cực nhỏ

    Lệnh gunzip giải nén tệp và lưu trữ nội dung trong một tệp mới có tên giống như tệp nén nhưng không có phần mở rộng. phần mở rộng tập tin gz. Lệnh cat hiển thị nội dung của một tệp. Tệp này chứa chuỗi chúng tôi đã viết trực tiếp vào tệp nén myfile. gz từ bên trong Python Shell

    Hình ảnh từ wiki

    stdin, stdout và stderr là các đường ống được tích hợp vào mọi hệ thống như Linux và MacOSX. Khi chúng ta gọi hàm print[], thứ chúng ta đang in sẽ được gửi đến đường ống xuất chuẩn. Khi chương trình của chúng tôi gặp sự cố và in ra một dấu vết, nó sẽ chuyển đến đường ống tiêu chuẩn. Theo mặc định, cả hai đường ống này chỉ được kết nối với thiết bị đầu cuối. Khi chương trình của chúng tôi in một cái gì đó, chúng tôi sẽ thấy đầu ra trong cửa sổ đầu cuối của mình và khi chương trình gặp sự cố, chúng tôi cũng sẽ thấy truy nguyên trong cửa sổ đầu cuối của mình. Trong Python Shell đồ họa, các ống xuất chuẩn và thiết bị xuất chuẩn mặc định cho Cửa sổ IDE của chúng tôi

    >>> import os
    >>> print[os.path.join['/test/', '/myfile']]
    /myfile
    
    7

    Thiết bị xuất chuẩn được xác định trong mô-đun sys và nó là một đối tượng luồng. Gọi hàm write[] của nó sẽ in ra bất kỳ chuỗi nào chúng ta đưa ra, sau đó trả về độ dài của đầu ra. Trên thực tế, đây là chức năng thực sự của hàm print[]; . tiêu chuẩn. viết

    hệ thống. thiết bị xuất chuẩn và sys. stderr gửi đầu ra của chúng đến cùng một nơi. ý tưởng Python nếu chúng ta đang ở trong hoặc thiết bị đầu cuối nếu chúng ta đang chạy Python từ dòng lệnh. Giống như đầu ra tiêu chuẩn, lỗi tiêu chuẩn không thêm dấu xuống dòng cho chúng tôi. Nếu chúng ta muốn xuống dòng, chúng ta sẽ cần viết các ký tự xuống dòng

    Lưu ý rằng thiết bị xuất chuẩn và thiết bị xuất chuẩn là chỉ ghi. Cố gắng gọi phương thức read[] của họ sẽ luôn gây ra lỗi IOError

    >>> import os
    >>> print[os.path.join['/test/', '/myfile']]
    /myfile
    
    8

    thiết bị xuất chuẩn và thiết bị xuất chuẩn chỉ hỗ trợ viết nhưng chúng không phải là hằng số. Chúng là những biến. Điều đó có nghĩa là chúng ta có thể gán cho chúng một giá trị mới để chuyển hướng đầu ra của chúng

    >>> import os
    >>> print[os.path.join['/test/', '/myfile']]
    /myfile
    
    9

    Nếu chúng ta chạy nó

    >>> pathname = "/Users/K/dir/subdir/k.py"
    >>> os.path.split[pathname]
    ['/Users/K/dir/subdir', 'k.py']
    >>> [dirname, filename] = os.path.split[pathname]
    >>> dirname
    '/Users/K/dir/subdir'
    >>> pathname
    '/Users/K/dir/subdir/k.py'
    >>> filename
    'k.py'
    >>> [shortname, extension] = os.path.splitext[filename]
    >>> shortname
    'k'
    >>> extension
    '.py'
    
    0

    Chúng tôi thực sự có hai câu lệnh with, một câu lệnh được lồng trong phạm vi của câu lệnh kia. Câu lệnh with bên ngoài mở một tệp văn bản được mã hóa utf-8 có tên là đầu ra để ghi và gán đối tượng luồng cho một biến có tên myFile

    Tuy nhiên,

    >>> pathname = "/Users/K/dir/subdir/k.py"
    >>> os.path.split[pathname]
    ['/Users/K/dir/subdir', 'k.py']
    >>> [dirname, filename] = os.path.split[pathname]
    >>> dirname
    '/Users/K/dir/subdir'
    >>> pathname
    '/Users/K/dir/subdir/k.py'
    >>> filename
    'k.py'
    >>> [shortname, extension] = os.path.splitext[filename]
    >>> shortname
    'k'
    >>> extension
    '.py'
    
    1

    Mệnh đề as ở đâu?
    Câu lệnh with không thực sự yêu cầu một. Chúng ta có thể có một câu lệnh with không gán ngữ cảnh cho một biến. Trong trường hợp này, chúng tôi chỉ quan tâm đến tác dụng phụ của ngữ cảnh StdoutRedirect

    Những tác dụng phụ đó là gì?
    Hãy xem bên trong lớp Chuyển hướng Stdout. Lớp này là trình quản lý ngữ cảnh tùy chỉnh. Bất kỳ lớp nào cũng có thể là trình quản lý bối cảnh bằng cách xác định hai phương thức đặc biệt. __enter__[] và __exit__[]

    Phương thức __init__[] được gọi ngay sau khi một thể hiện được tạo. Nó nhận một tham số, đối tượng luồng mà chúng ta muốn sử dụng làm đầu ra tiêu chuẩn cho vòng đời của ngữ cảnh. Phương thức này chỉ lưu đối tượng luồng trong một biến thể hiện để các phương thức khác có thể sử dụng nó sau này

    Phương thức __enter__[] là một phương thức lớp đặc biệt. Python gọi nó khi nhập ngữ cảnh [i. e. ở đầu câu lệnh with]. Phương pháp này lưu giá trị hiện tại của sys. stdout trong bản thân. oldOut, sau đó chuyển hướng đầu ra tiêu chuẩn bằng cách tự gán. newOut to sys. tiêu chuẩn

    Phương thức __exit__[] là một phương thức lớp đặc biệt khác. Python gọi nó khi thoát khỏi ngữ cảnh [i. e. ở cuối câu lệnh with]. Phương pháp này khôi phục đầu ra tiêu chuẩn về giá trị ban đầu của nó bằng cách chỉ định bản thân đã lưu. giá trị oldOut thành sys. tiêu chuẩn

    Câu lệnh with này có một danh sách ngữ cảnh được phân tách bằng dấu phẩy. Danh sách được phân tách bằng dấu phẩy hoạt động giống như một loạt các khối được lồng vào nhau. Bối cảnh đầu tiên được liệt kê là khối bên ngoài; . Bối cảnh đầu tiên mở một tệp; . thiết bị xuất chuẩn cho đối tượng luồng được tạo trong ngữ cảnh đầu tiên. Vì hàm print[] này được thực thi với ngữ cảnh được tạo bởi câu lệnh with nên nó sẽ không in ra màn hình;

    Bây giờ, khối mã đã kết thúc. Python đã yêu cầu mỗi trình quản lý ngữ cảnh làm bất cứ điều gì họ làm khi thoát khỏi ngữ cảnh. Các trình quản lý bối cảnh tạo thành một ngăn xếp vào trước ra trước. Khi thoát, bối cảnh thứ hai đã thay đổi sys. thiết bị xuất chuẩn trở lại giá trị ban đầu, sau đó ngữ cảnh đầu tiên đã đóng tệp có tên đầu ra. Vì đầu ra tiêu chuẩn đã được khôi phục về giá trị ban đầu, nên việc gọi hàm print[] sẽ in ra màn hình một lần nữa

    Ví dụ sau đây cho thấy một ví dụ khác về đọc và viết. Nó đọc hai tệp dữ liệu [từ điển từ linux và tên miền quốc gia cấp cao nhất, chẳng hạn như. chúng ta,. ly vv. ] và tìm sự kết hợp của cả hai trong một độ dài nhất định của tên miền đầy đủ

    >>> pathname = "/Users/K/dir/subdir/k.py"
    >>> os.path.split[pathname]
    ['/Users/K/dir/subdir', 'k.py']
    >>> [dirname, filename] = os.path.split[pathname]
    >>> dirname
    '/Users/K/dir/subdir'
    >>> pathname
    '/Users/K/dir/subdir/k.py'
    >>> filename
    'k.py'
    >>> [shortname, extension] = os.path.splitext[filename]
    >>> shortname
    'k'
    >>> extension
    '.py'
    
    2

    đầu ra mẫu

    >>> pathname = "/Users/K/dir/subdir/k.py"
    >>> os.path.split[pathname]
    ['/Users/K/dir/subdir', 'k.py']
    >>> [dirname, filename] = os.path.split[pathname]
    >>> dirname
    '/Users/K/dir/subdir'
    >>> pathname
    '/Users/K/dir/subdir/k.py'
    >>> filename
    'k.py'
    >>> [shortname, extension] = os.path.splitext[filename]
    >>> shortname
    'k'
    >>> extension
    '.py'
    
    3

    Từ khóa cuối cùng tạo ra sự khác biệt nếu mã của chúng tôi trả về sớm

    >>> pathname = "/Users/K/dir/subdir/k.py"
    >>> os.path.split[pathname]
    ['/Users/K/dir/subdir', 'k.py']
    >>> [dirname, filename] = os.path.split[pathname]
    >>> dirname
    '/Users/K/dir/subdir'
    >>> pathname
    '/Users/K/dir/subdir/k.py'
    >>> filename
    'k.py'
    >>> [shortname, extension] = os.path.splitext[filename]
    >>> shortname
    'k'
    >>> extension
    '.py'
    
    4

    Với mã này, khối cuối cùng được đảm bảo chạy trước khi phương thức trả về. Các trường hợp khi điều này có thể xảy ra

    Làm cách nào để kiểm tra xem chuỗi có tồn tại trong Python không?

    Bạn có thể sử dụng toán tử in hoặc phương thức tìm kiếm của chuỗi để kiểm tra xem một chuỗi có chứa một chuỗi khác không. Toán tử in trả về True nếu chuỗi con tồn tại trong chuỗi. Nếu không, nó trả về Sai. Phương thức find trả về chỉ mục của phần đầu của chuỗi con nếu tìm thấy, nếu không thì trả về -1.

    Làm cách nào để kiểm tra xem đường dẫn tệp có chứa thư mục trong Python không?

    Python Kiểm tra xem Thư mục có tồn tại không . path. Phương thức isdir[] kiểm tra xem thư mục có tồn tại hay không . Nó trả về Sai nếu bạn chỉ định đường dẫn đến tệp hoặc thư mục không tồn tại. Nếu một thư mục tồn tại, isdir[] trả về True.

    Làm cách nào để kiểm tra xem tên tệp có chứa chuỗi con trong Python không?

    Tóm tắt. Cách dễ nhất và hiệu quả nhất để xem liệu một chuỗi có chứa chuỗi con hay không là sử dụng nếu. trong các câu lệnh , trả về True nếu chuỗi con được phát hiện. Ngoài ra, bằng cách sử dụng hàm find[], có thể lấy chỉ mục mà chuỗi con bắt đầu tại đó hoặc -1 nếu Python không thể tìm thấy chuỗi con.

    Có chức năng chứa trong Python không?

    hàm chứa[] được sử dụng để kiểm tra xem mẫu hoặc biểu thức chính quy có được chứa trong một chuỗi Sê-ri hoặc Chỉ mục hay không . Hàm trả về Sê-ri hoặc Chỉ mục boolean dựa trên việc một mẫu hoặc biểu thức chính quy nhất định có được chứa trong một chuỗi Sê-ri hoặc Chỉ mục hay không.

Chủ Đề