python --文件操作

文件操作

打開【open】

操作【operating】

關閉【close】

打開文件:

f = open('/etc/passwd') 

讀文件:

f.read()

寫文件:

f.write()

關閉文件:

f.close()

查看文件的可讀寫狀態:

readable()  # 是否可讀
writable()  # 是否可寫

打開模式:

打開模式 只可以讀 只可以寫 讀寫兼備
文本模式 r w a r+ w+ a+
二進制模式 rb wb ab rb+ / (r+b) wb+ / (w+b) ab+ / (a+b)

r:
    1. 打開文件進行“只讀”操作,即只能從文件讀取內容
    2. 若欲操作的文件不存在,則打開失敗
    3. 成功打開文件時,文件指針位於文件開頭
    4. 打開文件後,不會清空文件內原有內容
    5. 可從文件中任意位置讀取內容
 
r+:
    1. 打開文件進行“讀寫”操作,即既可讀取,又可寫入
    2. 若欲操作的文件不存在,則打開失敗
    3. 成功打開文件時,文件指針位於文件開頭
    4. 打開文件後,不會清空文件內原有內容
    5. 無論是讀取內容還是寫入內容,都可在文件中任意位置進行,且進行寫入操作時,會覆蓋原有位置的內容
 
w:
    1. 打開文件進行“只寫”操作,即只能向文件寫入內容
    2. 若欲操作的文件不存在,則新建文件
    3. 成功打開文件時,文件指針位於文件開頭
    4. 打開文件後,會清空文件內原有的內容
    5. 可向文件中任意位置寫入內容,且進行寫入操作時,會覆蓋原有位置的內容
 
w+:
    1. 打開文件進行“讀寫”操作,即既可讀取,又可寫入
    2. 若欲操作的文件不存在,則新建文件
    3. 成功打開文件時,文件指針位於文件開頭
    4. 打開文件後,會清空文件內原有的內容
    5. 無論是讀取內容還是寫入內容,都可在文件中任意位置進行,且進行寫入操作時,會覆蓋原有位置的內容 
 
a:
    1. 打開文件進行“追加”操作,即只能向文件寫入內容
    2. 若欲操作的文件不存在,則新建文件
    3. 成功打開文件時,文件指針位於文件結尾
    4. 打開文件後,不會清空文件內原有內容
    5. 只能向文件末尾追加(寫)內容
 
a+:
    1. 打開文件進行“讀寫”操作,即既可讀取,又可寫入
    2. 若欲操作的文件不存在,則新建文件
    3. 成功打開文件時,文件指針位於文件結尾
    4. 打開文件後,不會清空文件內原有內容
    5. 讀取內容時,可以在任意位置進行,但寫入內容時,只會追加在文件尾部 

打開模式 簡述 文件不存在  文件指定位置  是否清空原有內容 讀取位置  寫入位置 是否會覆蓋
r 只讀 打開失敗 開頭 任意位置讀取 不可寫入 -
w 只寫 新建  開頭 不可讀取 任意位置寫入  寫入時會覆蓋原有位置內容
a 新建 結尾 不可讀取 只能尾部寫入 -
r+ 讀寫 打開失敗 開頭 任意位置讀取  任意位置寫入 寫入時會覆蓋原有位置內容
w+ 新建 開頭 任意位置讀取 任意位置寫入  寫入時會覆蓋原有位置內容
a+ 新建  結尾 任意位置讀取  只能尾部寫入 -

移動指針(seek方法)

seek方法移動變量
    seek第一個參數是偏移量:>0,代表向右移動,<0,代表向左移動
    seek第二個參數是:
            0:移動指針到文件開頭
            1:不移動指針
            2:移動指針到末尾

with

with語句提供了一種非常方便的處理方式,可以很好的避免以下問題:

  • 可能忘記關閉文件句柄;
  • 文件讀取數據發生異常,沒有進行任何處理
# python3寫法:
with open('/tmp/passwd') as f1 , open('/tmp/passwdBackUp','w+') as f2:
    f2.write(f1.read()) # 將f1讀取的內容寫入f2中
    # 這裏要注意,在寫入內容後,指針當前位置在文件的尾部,如果直接讀取文件,無法讀取到
    # 那麼,我們要先將指針調整到首部
    f2.seek(0)
    print(f2.read())
 
# python2寫法:
with open('/tmp/passwd') as f1:
    content = f1.read()
with open('/tmp/passwdBackUp','w+'):
    f2.write(content)

 文件OS

os.name                 # 當前系統,結果表示posix -> linux  |  nt    -> windows
 
os.uname                # 顯示sysname[操作系統]、nodename[主機名]、release[內核版本]、version[版本]、machine[機器架構]信息
os.uname().sysname      # 顯示操作系統
 
os.environ              # 系統環境變量
os.environ.get('PATH')  # 獲取key爲PATH的value值
 
os.walk()               # 遍歷指定目錄下的所有內容
 
# 1. 判斷是否爲絕對路徑[是否以‘/’開頭],且只判斷路徑,不會判斷文件是否存在
print(os.path.isabs('/tmp/student'))
print(os.path.isabs('student'))
 
# 2. 生成絕對路徑
print(os.path.abspath('timg.jpg')) # 根據當前目錄生成
print(os.path.join('/home/dsd','timg.jpg')) # 拼接絕對路徑
print(os.path.join(os.path.abspath('.'),'timg.jpg')) # 用.表示當前目錄
 
# 3. 獲取目錄名或文件名
filename = '/root/PycharmProjects/westos/day07/timg.jpg'
print(os.path.basename(filename))   # 獲取filename中的文件名
print(os.path.dirname(filename))    # 獲取filename中的目錄名
 
# 4. 如何刪除和創建目錄
os.mkdir('xyz')            # 創建目錄
os.makedirs('img/files')   # 創建遞歸目錄
os.rmdir('xyz')            # 刪除目錄,只能刪除空目錄
 
# 5.創建文件
os.mknod('note.txt')       # 創建文件
os.remove('note.txt')      # 刪除文件
 
# 6. 重命名
os.rename('data.txt','data1.txt') # 將data.txt名稱修改爲data1.txt
 
# 7. 判斷文件或目錄是否存在
print(os.path.exists('note.txt'))
 
# 8. 分離文件名和後綴名
print(os.path.splitext('note.txt'))
 
# 9. 分離目錄名和文件名
print(os.path.split('/tmp/dsd/text.jpg'))
 
# 10. 獲取文件時間
time1 = os.path.getctime('/etc/shadow')
print(time1) 

時間格式的轉換

# 1. 把元組時間改爲時間戳
tuple_time = time.localtime()
print(tuple_time)
print(time.mktime(tuple_time))
 
# 2. 元組時間轉換爲字符串時間
print(time.strftime('%m-%d',tuple_time))
print(time.strftime('%Y-%m-%d',tuple_time))
print(time.strftime('%T',tuple_time))
print(time.strftime('%F',tuple_time))
 
# 3. 時間戳時間轉換爲字符串時間
pwd_time = os.path.getctime('/etc/passwd')
print('pwd_time',pwd_time)
print(time.ctime(pwd_time))
 
# 4. 時間戳轉換爲元組時間
print(time.localtime(pwd_time))

文件讀寫練習

f = open('/tmp/passwd')
 
print(f.readable())
print(f.writable())

此時文件狀態是可讀但是不可寫,在讀取文件時,加'r+'

f = open('/tmp/passwd','r+')

在文件裏面寫內容

f.write('hello world')

指針練習

打開文件,默認指針在首位,在執行完寫操作後,指針就處於寫入內容後,第一次f.read()讀取是從寫入的內容後面開始,通過f.tell()告知指針當前位置;再執行一次讀操作,結果爲空,因爲它是從最後面開始讀,其後面已經沒有字符,因此爲空。 

# 將timg.jpg文件複製
# 非文本文件的讀取
f1 = open('timg.jpg',mode = 'rb')
content = f1.read()
f1.close()
 
f2 = open('test.jpg',mode='wb')
f2.write(content)
f2.close()

 創建文件data.text,文件共100000行,每行存放一個1~100之間的整數

import random
with open('data.txt','w+') as f:
    for i in range(100000):
        f.write(str(random.randint(1,100)) + '\n')
        # 轉換成字符串原因是字符串支持連接
    f.seek(0)
    print(f.read())

1. 生成一個大文件ips.txt,要求1500行,每行隨機爲192.168.43.0/24段的ip
2. 讀取ips.txt文件,統計文件中ip出現頻率前10的ip

import random
def create_ipFile(filename):
    ip = ['192.168.43.' + str(i) for i in range(1,255)]
    with open(filename,'w+') as f:
        for i in range(1500):
            f.write(random.sample(ip,1)[0] + '\n')
# create_ipFile('ips.txt')
def sorted_file(filename,count=10):
    ips_dict = dict()
    with open(filename) as f:
        for ip in f:
            ip = ip.strip()  # 清除空格帶來的影響
            if ip in ips_dict:
                ips_dict[ip] += 1
            else:
                ips_dict[ip] = 1
# :前面是形參,後面是返回值
    sorted_ip = sorted(ips_dict.items(),key=lambda x:x[1],reverse=True)[:count]
    return sorted_ip
print(sorted_file('ips.txt'))

生成100個MAC地址並寫入文件中,MAC地址前6位(16進制)爲01-AF-3B
01-AF-3B
01-AF-3B-xx
01-AF-3B-xx-xx
01-AF-3B-xx-xx-xx 

import random
import string
def create_mac():
    MAC = '01-AF-3B'
    hex_num = string.hexdigits
    for i in range(3):
        n = random.sample(hex_num,2)
        sn = '-' + ''.join(n).upper()
        MAC += sn
    return MAC
def main():
    with open('mac.txt','w+') as f:
        for i in range(100):
            mac = create_mac()
            print(mac)
            f.write(mac + '\n')
main()

1. 在當前目錄新建目錄img,裏面包含100個文件,100個文件名各不相同(X4G5.png)
2. 將當前img目錄所有以.png結尾的後綴名改爲:.jpg 

import random
import string
import os
from os.path import splitext
# 生成隨機碼
def create_random(len=4,li=['.bmp','.jpeg','.png','.gif']):
# string.digits + string.ascii_letters:隨機碼由數字和大小寫字母組成
    random_list = [random.choice(string.digits + string.ascii_letters) for i in range(len)]
    return ''.join(random_list) + random.choice(li)
# 創建img目錄,生成100個文件
def create_dir_file(dirname = 'img'):
    if not os.path.exists(dirname):
        os.mkdir(dirname)
    else:
        print(dirname + 'is exists')
        exit()
    for i in range(100):
        os.mknod(dirname + '/' + create_random())
# 尋找img目錄下後綴名爲.png文件,將後綴名修改爲.jpg
def mod_suffix(dirname = 'img',old_suffix='.png',new_suffix='.jpg'):
    # .png後綴名文件
    aimsFiles = [filename for filename in os.listdir(dirname) if filename.endswith(old_suffix)]
    # filter(函數,序列)  lambda 形參:返回值
    # aimsFiles = filter(lambda filename:filename.endswith(old_suffix),os.listdir(dirname))
    # 分離目標文件名和後綴名
    basename = [os.path.splitext(filename)[0] for filename in aimsFiles]
    # 更改文件後綴名
    for i in basename:
        old_name = os.path.join(dirname,i + old_suffix)
        new_name = os.path.join(dirname,i + new_suffix)
        os.rename(old_name,new_name)
    print('%s is renamed,The suffix is now %s' %(old_name,new_name))
create_dir_file()
mod_suffix()

知識點應用

需求:
    1. 獲取當前主機信息, 包含操作系統名, 主機名,
    內核版本, 硬件架構等
    2. 獲取開機時間和開機時長;
    3. 獲取當前登陸用戶

print('主機信息'.center(50,'*'))
info = os.uname()
print(
    """
    操作系統: %s
    主機名稱: %s
    內核版本: %s
    硬件架構: %s
    """%(info.sysname,info.nodename,info.release,info.machine)
)
print('開機信息'.center(50,'*'))
boot_time = psutil.boot_time()
boot_time_obj = datetime.fromtimestamp(boot_time)
# print(type(boot_time_obj))
now_time = datetime.now()
time1 = now_time - boot_time_obj
 
print('開機時間',boot_time_obj)
print('當前時間',str(now_time).split('.')[0])
print('開機時長',str(time1).split('.')[0])
print('當前登陸用戶'.center(50,'*'))
login_user = psutil.users()
print(login_user[0].name)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章