python learning notes 9: file and directory operations


1. writing documents

Example 1: Recommended Practice: with... as: it is not necessary to close the file manually;

>>> with open('tmp.txt', 'w') as fh: #Use with to open. After using fh, you do not need to close it manually;  
...     fh.write('line0\n') # Need to add line breaks manually  
...     fh.write('line1\n')  

Example 2: as a general practice, open the file, write the file, and close the file; It is recommended to use the method of with, which does not need to close the file manually

>>> fh = open('tmp.txt', 'w')  
>>> fh.write('line0\n') # Note that line breaks will not occur automatically, and line breaks need to be added manually;  
>>> fh.write('line1\n')  
>>> fh.close() # Need to close after use  

2. read the file

Example 1: recommended practice, with... as: no need to close the file manually

>>> with open('tmp.txt', 'r') as fh: #To open a file using with, you do not need to close the file manually
...     for line in fh:  
...         print(line, end='') # There is no line break at the end of the line, or print(line.strip('\n'))  

If the file to be opened contains Chinese, it will result in a report of unicodedecodeerror:'gbk'codec can't decode byte..., in this case, you can add an edit parameter to open: open ('tmp.txt','r', encoding='utf-8')

(obtain line number and line text at the same time: for lineno, line in enumerate(fh, 1))

Example 2: general practice: open the file, read the file, and close the file; Recommended practices for with

>>> fh = open('tmp.txt') #No open mode is declared. The default mode is read, that is, the second parameter is r by default
>>> while True:  
...     line = fh.readline()#readline, read a line  
...     if len(line) == 0:#If the length is equal to 0, it means the end of the file. Note that the length of the blank line is 1, and the newline character occupies a length  
...         break  
...     print(line)  
>>> fh.close()  
<Blank line> #Because print will add a newline character at the end by default  
<Blank line>  

Several read functions

>>>       #Read the whole file and put it into a string variable;  
>>> fh.readline()   #Read only one line at a time and put it into the string;  
>>> fh.readlines()  #Read the entire file and analyze it into a list;  

Example 3:

>>> with open('tmp.txt', 'r') as fh:  
...     txt = # 'line0\nline1\n', read all rows and return str;  

Example 4:

>>> with open('tmp.txt', 'r') as fh:  
...     txt0 = fh.readline()# 'line0\n', read one row at a time;  
...     txt1 = fh.readline().strip() # 'line1', read one line at a time, and str.strip() can remove line breaks and spaces at the end of the line;  

Example 5:

>>> with open('tmp.txt', 'r') as fh:  
...      list_txt = fh.readlines() # ['line0\n','line1\n'], read all rows and put them in the list;  

3. read the compressed file (.gz)

Read the gz file using the gzip module:

import gzip  
with'file.txt.gz', 'rb') as fid: # Read mode is rb  
for line in fid:  
    line = line.decode() # The read line is in binary format (b''), which needs to be decoded  
    line = line.strip('\n') # Remove line breaks  

4. mode of opening file

mode describe
r Open the file as read-only. The pointer to the file will be placed at the beginning of the file. This is the default mode.
w Open a file for writing only. If the file already exists, open the file and edit it from the beginning, that is, the original content will be deleted. If the file does not exist, create a new file.
a Open a file for appending. If the file already exists, the file pointer is placed at the end of the file. That is, the new content will be written after the existing content. If the file does not exist, create a new file to write.
rb Binary mode of r
wb Binary mode of w
ab Binary mode of a
r+ r (the nonexistent file will not be created. Writing from the top will overwrite the contents of the previous position. If reading before writing, the contents will be appended at the end of the file.)
w+ w read / write mode (if the file exists, the entire file will be overwritten; if it does not exist, it will be created. The writing will not be completed until it is close d)
a+ a's read / write mode (readable and writable, read content from the top of the file, add content from the bottom of the file, and create if it does not exist)
rb+ Binary + read / write mode of r
wb+ Binary + read / write mode of w
ab+ Binary + read / write mode of a

5. with... as statement

You can use the with statement instead of the try... finally statement. The advantage is that the syntax is relatively concise. See also section 15.2.
No matter whether an exception occurs during file processing, it can ensure that the open file handle is closed after the with statement is executed.

>>> with open(file, 'r') as f:
...     print(

Equivalent to the following:

>>> try:
...     f = open(file, 'r')
...     print(
... finally:
...     if f:
...         f.close()

6. document test / document judgment

1. judge whether the file / directory exists

>>> os.path.exists(test_file) # True | False
>>> os.path.exists(test_dir)# True | False

2. judge whether the file is a directory or an ordinary file

>>> os.path.isfile(test_target) # Test_ When target is a normal file, it returns True; when it is a directory or the directory does not exist, it returns False;
>>> os.path.isdir(test_target) # Test_ When target is a directory, it returns True; when it is a normal file or the file does not exist, it returns False;

3. judge whether the document is readable or writable

>>> os.access(test_file, os.F_OK) # File exists, return True;
>>> os.access(test_file, os.R_OK) # The file is readable and returns True;
>>> os.access(test_file, os.W_OK) # The file is writable and returns True;
>>> os.access(test_file, os.X_OK) # The file is executable and returns True;

7. file, directory and path

Get the directory where the program is located:

#Assume that the contents of the PY file /test/path/ are  
import os, sys  
print(f'os.getcwd() = {os.getcwd()}')  
print(f'sys.path[0] = {sys.path[0]}')  
#The user executes in the /home/g444054/ directory  
$ python /test/path/  
os.getcwd() = /home/g444054 # Returns the path to execute the command   
sys.path[0] = /test/path    # The path of the script is returned   

List the files in the specified directory (when the specified directory is empty, the default is the current directory), and return the list. Note: the returned list element does not contain the corresponding path, but only the file name. To recurse directories, you need to use os Walk

>>> os.listdir(path)  
['file0', 'file1', 'dir0']  

Create directory, delete directory, delete file, copy file

>>> os.mkdir(path)# Create a directory;  
>>> os.rmdir(path)# To delete a directory recursively, use shutil Rmtree;  
>>> os.remove(file) # Delete the file;  
>>> os.rename('test.txt', '') # rename  
>>> shutil.copy('/home/g004440**/.cshrc', '/home/n004435**/') #Copy file  
>>> shutil.copytree('/home/g004440**/dir0', '/home/g004440**/dir.bak') #Copy directories and all internal files The destination folder cannot already exist  
>>> shutil.rmtree(path) # To delete a directory tree, you must point to a folder, not a symbolic link  

Switch directories

>>> os.chdir(path)# Switch directories  

File size (bytes)

>>> os.path.getsize(filename) #Return file size, invalid for directory  

Split the specified path: os Path Split (path) (must have a parameter) returns a tuple containing two elements:
[0]: the path where the file or directory is located, or through os Path Dirname (path) get
[1] : directory name or file name

>>> os.path.split('/home/g004440**/script')  
('/home/g004440**', 'script')  
>>> os.path.split('/home/g004440**/script/') # Include '/' at the end, and return all to the path  
('/home/g004440**/script', '') # Whether script is a directory or not  
>>> os.path.split('/home')  
('/', 'home')  
>>> os.path.split('/home/')  
('/home', '')  

Split the file extension and return a tuple

>>> os.path.splitext('/home/g004440**/.vim.rc')  
('/home/g004440**/.vim', '.rc')  

Merge paths. If Linux will use / merge, in Win, yes\

>>> os.path.join('/home', 'g00444054', 'script') # Merge path,  
>>> os.path.join('/home', 'g00444054', 'script', '')  
'/home/g004440**/script/' # If there is an empty element at the end, an extra '/' will be returned  
>>> os.path.join('', '/home', '', 'g00444054', 'script')  
'/home/g004440**/script' # Empty elements in the front or middle do not affect the result  

Get the absolute path of the path os Path Abspath (path) or os Path Realpath (path)

>>> os.path.abspath('.')  
>>> os.path.abspath('..')  
>>> os.path.abspath('../xxx') # xxx may not exist.  
>>> os.path.realpath('../xxx') # xxx may not exist.  

8. traverse directory

Directory structure test_walk

    |-- dir0  
    |-- dir1  
    |    |-- dir1.file0  
    |    |-- dir1.file1  
    |-- dir2  
    |    |-- dir2.dir0  
    |    |-- dir2.dir1  
    |-- file0  
    `-- file1  


for _s_one_path, _list_dirs, _list_files in os.walk('test_walk'):  
    print(f'{_s_one_path}/')         #Test_ All levels in the walk directory
    for _s_one_dir in _list_dirs:    #Current_ S_ One_ dir in a hierarchy in the path directory
        print(f'    {_s_one_dir}/')  
    for _s_one_file in _list_files:  #Current_ S_ One_ file in a hierarchy in the path directory
        print(f'    {_s_one_file}')  


    dir0/   # Test_ Three dirs in the walk directory  
    file0   # Test_ Two file s in the walk directory  
test_walk/dir0/ # Test_ There are no dir and file in the walk/dir0 directory  
test_walk/dir1  # Test_ There is no dir in the walk/dir0 directory, there are 2 file s  
test_walk/dir2  # Test_ There are two dirs in the walk/dir2 directory, but no file  
test_walk/dir2/dir2.dir0  # Test_ Walk/dir2/dir2 No dir and file in dir0 directory  
test_walk/dir2/dir2.dir1  # Test_ Walk/dir2/dir2 No dir and file in dir1 directory  

Posted by kronikel on Thu, 02 Jun 2022 02:57:50 +0530