Đường dẫn tệp Python

Hàm nhận một đối số

/Users/dannysteenman/home/projects/example-project/src/examplefile.txt
9 tùy chọn và ghi nó vào đầu ra tiêu chuẩn mà không có một dòng mới ở cuối

Bước tiếp theo là sử dụng phương pháp để kiểm tra xem tệp hoặc thư mục có tồn tại không

Phương thức

>>> import os
>>> print(os.getcwd())
C:\Python32
>>> os.chdir('/test')
>>> print(os.getcwd())
C:\test
0 trả về
>>> import os
>>> print(os.getcwd())
C:\Python32
>>> os.chdir('/test')
>>> print(os.getcwd())
C:\test
1 nếu đường dẫn được cung cấp tồn tại và
>>> import os
>>> print(os.getcwd())
C:\Python32
>>> os.chdir('/test')
>>> print(os.getcwd())
C:\test
2 nếu không

Đường dẫn có thể trông giống như.

>>> import os
>>> print(os.getcwd())
C:\Python32
>>> os.chdir('/test')
>>> print(os.getcwd())
C:\test
3 (Windows) hoặc
>>> import os
>>> print(os.getcwd())
C:\Python32
>>> os.chdir('/test')
>>> print(os.getcwd())
C:\test
4 (Linux và MacOS)

Bạn có thể sử dụng câu lệnh

>>> import os
>>> print(os.getcwd())
C:\Python32
>>> os.chdir('/test')
>>> print(os.getcwd())
C:\test
5 để mở tệp đã chỉ định nếu nó tồn tại

Cú pháp

>>> import os
>>> print(os.getcwd())
C:\Python32
>>> os.chdir('/test')
>>> print(os.getcwd())
C:\test
00 đảm nhiệm việc tự động đóng tệp ngay cả khi có ngoại lệ

Nếu đường dẫn được cung cấp không tồn tại, câu lệnh

>>> import os
>>> print(os.getcwd())
C:\Python32
>>> os.chdir('/test')
>>> print(os.getcwd())
C:\test
01 sẽ chạy và chúng tôi in một thông báo cho người dùng

Các hệ điều hành như Windows, Linux hoặc macOS có các cấu trúc đường dẫn khác nhau trong đó các tệp hệ điều hành được lưu trữ

Do đó, khi bạn chạy tập lệnh Python trên các máy này và muốn tìm nạp tệp hoặc thư mục, bạn muốn tự động tìm đường dẫn tuyệt đối của tệp so với thư mục hiện tại thay vì mã hóa cứng nó cho mọi hệ thống

Đường dẫn tuyệt đối còn được gọi là đường dẫn đầy đủ và bắt đầu bằng

>>> import os
>>> print(os.getcwd())
C:\Python32
>>> os.chdir('/test')
>>> print(os.getcwd())
C:\test
8 trong Linux và macOS và
>>> import os
>>> print(os.getcwd())
C:\Python32
>>> os.chdir('/test')
>>> print(os.getcwd())
C:\test
9 trên Windows

Để tìm đường dẫn tuyệt đối trong Python, bạn nhập mô-đun

>>> 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, sau đó bạn có thể tìm thư mục làm việc hiện tại bằng cách sử dụ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
1 trong tập lệnh Python của mình

Mục lục

1

Đường dẫn tuyệt đối trong Python là gì?

Đường dẫn tuyệt đối trong Python là đường dẫn đầy đủ bắt đầu từ thư mục gốc của hệ thống tệp điều hành cho đến thư mục làm việc

Vì vậy, giả sử bạn chạy mã Python của mình trong

>>> 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. Đây là điểm vào nơi bạn chạy mã cấp cao nhất của mô-đun python của mình

Sau đó, đây là đường dẫn tuyệt đối của thư mục làm việc của bạn

>>> 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

Cách tìm đường dẫn tuyệt đối trong Python

Như đã đề cập ở đầu bài viết này, bạn có thể chạy ứng dụng Python của mình trên các hệ điều hành khác nhau, do đó bạn muốn tự động tìm đường dẫn đầy đủ của tệp bạn muốn nhập trong mã của mình thay vì mã hóa cứng nó

Vì vậy, với một đường dẫn chẳng hạn như 

>>> 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, làm thế nào để bạn tìm thấy đường dẫn tuyệt đối của tệp so với thư mục làm việc hiện tại (_______53) trong Python?

Để có được đường dẫn tuyệt đối trong Python, bạn viết đoạn mã sau

import os

os.path.abspath("src/examplefile.txt")

Để giải thích mã Python. trước tiên, bạn phải nhập mô-đun

>>> 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 bằng Python để có thể chạy các chức năng của hệ điều hành trong mã của mình

Sau đó, bạn sử dụng thư viện

/Users/dannysteenman/home/projects/example-project/src/examplefile.txt
1 để trả về phiên bản chuẩn hóa tuyệt đối của đường dẫn tên đường dẫn

Điều này sẽ dẫn đến đầu ra sau

/Users/dannysteenman/home/projects/example-project/src/examplefile.txt

Phần kết luận

Như bạn có thể thấy, đường dẫn tuyệt đối giúp bạn tìm đường dẫn đầy đủ của tệp hoặc thư mục so với thư mục làm việc hiện tại. Điều này rất hữu ích vì bạn có thể linh hoạt tìm tệp hoặc thư mục và trả về đường dẫn chính xác trên các hệ điều hành khác nhau

Để có đường dẫn tuyệt đối trong Python, bạn sử dụng thư viện

/Users/dannysteenman/home/projects/example-project/src/examplefile.txt
2. Chèn tên tệp của bạn và nó sẽ trả về đường dẫn đầy đủ tương đối từ thư mục làm việc bao gồm tệp

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

________số 8

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()

/Users/dannysteenman/home/projects/example-project/src/examplefile.txt
0

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

/Users/dannysteenman/home/projects/example-project/src/examplefile.txt
1

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

/Users/dannysteenman/home/projects/example-project/src/examplefile.txt
2

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

Chuỗi là một dãy 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ậ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 một thuật toán mã hóa ký tự cụ thể và trả về một chuỗi ký tự .

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

/Users/dannysteenman/home/projects/example-project/src/examplefile.txt
3

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

Chuyện gì vừa xảy ra vậy?
Chúng tôi không chỉ định mã hóa ký tự nên 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 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ừ 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 lại(). 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 {. <5} có nghĩa là in đối số này căn trái trong vòng 5 dấu cách. Biến a_line chứa dòng hoàn chỉnh, dấu xuống dòng và tất cả. Phương thức chuỗi rstrip() loại bỏ khoảng trắng ở cuối, bao gồm các ký tự xuống dòng

Chúng ta có thể ghi vào các tệp giống như cách chúng ta đọc từ chúng. Đầu tiên, chúng ta mở một tệp và lấy một đối tượng tệp, sau đó chúng ta sử dụng các phương thức trên đối tượng luồng để ghi dữ liệu vào tệp, sau đó đóng tệp

Phương thức write() ghi một chuỗi vào tệp. không có giá trị quay lại. Do bộ đệm, chuỗi có thể không thực sự hiển thị trong tệp cho đến khi phương thức flush() hoặc close() được gọi

Để mở tệp để ghi, hãy sử dụng hàm open() và chỉ định chế độ ghi. Có hai chế độ tệp để ghi như được liệt kê trong bảng trước đó

  1. chế độ ghi sẽ ghi đè lên tệp khi mode='w' của hàm open()

  2. chế độ nối thêm sẽ thêm dữ liệu vào cuối tệp khi mode='a' của hàm open()

Chúng ta phải luôn đóng tệp ngay sau khi ghi xong vào tệp đó, để giải phóng phần xử lý tệp và đảm bảo rằng dữ liệu thực sự được ghi vào đĩa. Đối với việc đọc dữ liệu từ một tệp, chúng ta có thể gọi phương thức close() của đối tượng luồng hoặc chúng ta có thể sử dụng câu lệnh with và để Python đóng tệp cho chúng ta

>>> 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'

Đường dẫn tệp Python

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 các phần 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. - viwiki

>>> 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;


Đường dẫn tệp Python

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

Đường dẫn tệp Python

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ệnh đề as. 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 StdoutRedirect. 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

Đường dẫn tệp Python ở đâu?

Để truy xuất tệp trong Python, bạn cần biết chính xác đường dẫn đến tệp, trong Windows, bạn có thể xem đường dẫn của tệp cụ thể bằng cách nhấp chuột phải vào Tệp- . .

Đường dẫn (__ tệp __) trong Python là gì?

Biến __file__. __file__ là biến chứa đường dẫn đến mô-đun hiện đang được nhập . Python tạo một biến __file__ cho chính nó khi nó chuẩn bị nhập một mô-đun.

Làm cách nào để sử dụng đường dẫn trong Python?

Để sử dụng nó, bạn chỉ cần chuyển đường dẫn hoặc tên tệp vào đối tượng Path() mới bằng cách sử dụng dấu gạch chéo lên phía trước và nó xử lý phần còn lại. Lưu ý hai điều ở đây. Bạn nên sử dụng dấu gạch chéo về phía trước với các hàm pathlib. Đối tượng Path() sẽ chuyển đổi các dấu gạch chéo về phía trước thành loại dấu gạch chéo chính xác cho hệ điều hành hiện tại.

Đường dẫn tệp mặc định trong Python là gì?

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 c:\Python32 .