廣西打假扶優信息協會正式落戶北海_飲水機

※使用真空封口機常見問題?

封口機用途廣泛,各產業袋類包裝,食品包裝、豆乾、喜餅、咖啡豆、咖啡粉掛耳包、鳳梨酥等等

2019年3月10日廣西壯族自治區打假扶優信息協會北海辦事處正式入駐中國电子北部灣信息港,廣西打假扶優信息協會是廣西壯族自治區民政廳註冊,由廣西壯族自治區市場監督管理局業務管理的非盈利性協會,成立於2003年,十年如一日的為廣西省內企業提供全方位的扶持與幫助,會員數以達到近千家之多。

廣西打假扶優信息協會北海辦事處的成立也預示着,打擊假冒偽劣、扶持優質品牌工作走進百姓生活,為廣西壯族自治區真正落實中共中央、國務院出台的《關於完善促進消費體制機制進一步激發居民消費潛力的若干意見》,建立健全消費領域信用體系,作為對商品和服務進行社會監督深入基層起到了帶頭作用。

中國电子北部灣信息港

廣西打假扶優信息協會北海辦事處由醫療、商務、文化、企業各類優秀人才組成,團結優質品牌企業,開拓新時代、新思路。每天都是3.15,每周都是維權周,每月都是活動月,致力於打造廣西壯族自治區本土優秀品牌,幫助中小企業,扶持三農經濟發展等方面工作。

廣西打假扶優信息協會北海辦事處領導班子

廣西打假扶優信息協會北海辦事處入駐中國电子北部灣信息港得到了中國电子信息協會北海主要領導的大力支持與幫助,也預示着廣西打假扶優信息協會從衣食住行的簡單工作逐步上升到电子科技、互聯網行業及高新產業領域,北海辦事處領導班的組建也是通過協會層層審核多方考慮建立起來的。

廣西打假扶優信息協會北海辦事處常務副主任陳業毅同志

飲水機設備有哪些?

步步經營服務始終如一於雲嘉南地區,建立優質的飲水機之品牌

廣西打假扶優信息協會北海辦事處副主任但柏同志

廣西打假扶優信息協會北海辦事處副主任田亮同志

廣西打假扶優信息協會北海辦事處副主任張軍華同志

廣西打假扶優信息協會北海辦事處科長劉小勤同志

廣西打假扶優信息協會北海辦事處辦公場地500平方,配套設施健全,分為假冒偽劣信息服務窗口、優質企業品牌扶持辦事大廳,食品、藥品、醫療器械、三農、电子科技互聯網交流中心。全方位立體式的落實廣西打假扶優信息協會賦予的神聖使命。

也希望更多的優質企業、社會各界積极參与,給與支持與指導,歡迎社會各界朋友前來交流溝通。為健康消費,良性發展共創和諧社會共同努力,奔向美好未來!

本站聲明:網站內容來源http://www.societynews.cn/html/xw/sh/,如有侵權,請聯繫我們,我們將及時處理

※客製專屬滑鼠墊、可愛造型L夾L型資料夾、透明證件套、手提袋,專業印刷設計廠商!

通過SGS環保認證,無毒無害 環保材質符合歐盟RoHs、REACH認證

百度霸屏王九山受邀參加“她時代.追夢人”為女性成長賦能_橡膠

※真空封口機該不該買?使用心得分享

各式封口機、包裝機械、客製化訂做、特殊改造

百度霸屏王九山受邀參加“她時代.追夢人”為女性成長賦能2019年3月9日,由金濤首次舉辦的“她時代·追夢人”大會,在廣州白雲國際會議中心正式舉行。

【她時代現場】

參与本次大會的嘉賓有:思埠集團董事會主席吳召國、微商百度霸屏第一人王九山、中國新零售集團董事長張愛林、卡瘦生物科技有限公司總裁郝穎、她時代創始人安瞳、她時代商學院院長朱雀老師、三帥六將創始人阿彬老師、敏娘娘等等,可謂大咖雲集。

【現場大咖雲集】

現場王九山分享了百度霸屏對品牌及個人IP打造的重要性,詳細講解了百度霸屏對品牌及個人IP塑造的優勢,賦能女性創業,得到現場參會者的一致認可!

※特殊造型滑鼠墊去哪買?

滑鼠墊是滑鼠的好夥伴,可使滑鼠游標穩定滑順,多樣的材質

【王九山現場分享百度霸屏】

“她時代”

“她時代”的女性正在喚醒人們對女性角色的重新定義

她們對生活充滿熱情、用溫柔呵護家庭、用魅力平衡世界

她們向全世界展現張弛有度的領導才能、积極進取的商業魅力和探索未來的無限激情

向世界發出“她時代”的強音

世界因女性而美好

【她時代大會現場盛況】

本次大會地點設在廣州白雲國際會議中心,據大會官方數據稱,有超過3000名來自全國各個領域的知名女性受邀或主動參与這次會議。

本次大會,即是女性創業者的一場峰會,更是對女性創業者的高度推崇!大會過後,參會女性創業者表示,此次會議認識了全國各地的很多精英女性,了解了更多的網絡新知識,接觸了大量的新思路,開闊了眼界,對個人對企業來說,都收穫頗多。獲得這麼好的機會參与,感謝金濤,感謝“她時代”!

本站聲明:網站內容來源http://www.societynews.cn/html/xw/sh/,如有侵權,請聯繫我們,我們將及時處理

※如何選購橡膠製品規格有哪些?

品質優益穩定,效率高成本低,並已獲得國內外大廠承認使用,品質合乎EIA國際標準, 此外也針對客戶端的需要代客Tape and Reel封裝服務。

一本正經的聊數據結構(6):最優二叉樹 —— 哈夫曼樹_租車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

前文傳送門:

「一本正經的聊數據結構(1):時間複雜度」

「一本正經的聊數據結構(2):數組與向量」

「一本正經的聊數據結構(3):棧和隊列」

「一本正經的聊數據結構(4):樹」

「一本正經的聊數據結構(5):二叉樹的存儲結構與遍歷」

基礎知識

感謝某位在後台留言的同學,讓我想起來我還有這個沒寫完的系列。

在最開始,先了解幾個基礎概念:

  • 路徑:在一棵樹中,一個結點到另一個結點之間的通路,稱為路徑。

上面這個二叉樹中,根節點 A 到恭弘=叶 恭弘子結點 I 的路徑,就是A,B,D,I。

  • 路徑長度:在一條路徑中,每經過一個結點,路徑長度都要加 1 。例如在一棵樹中,規定根結點所在層數為1層,那麼從根結點到第 i 層結點的路徑長度為 i – 1 。

在這個二叉樹中,根節點 A 到恭弘=叶 恭弘子結點 H 的路徑長度就是 3 。

  • 結點的權:給每一個結點賦予一個數值,被稱為這個結點的權。
  • 結點的帶權路徑長度:指的是從根結點到該結點之間的路徑長度與該結點的權的乘積。

我們假設節點 H 的權是 5 ,從根結點到結點 H 的路徑長度是 3 ,那麼結點 H 的帶權路徑長度是 3 X 5 = 15。

  • 樹的帶權路徑長度:在一棵樹中,所有恭弘=叶 恭弘子結點的帶權路徑長度之和,被稱為樹的帶權路徑長度,也被簡稱為 「WPL」 。

還是這顆樹,它的帶權路徑長度是 1 X 2 + 2 X 1 + 2 X 3 + 2 X 4 + 3 X 5 + 3 X 6 = 51 。

哈夫曼樹

哈弗曼樹就是在用 n 個結點(都做恭弘=叶 恭弘子結點且都有各自的權值)試圖構建一棵樹時,如果構建的這棵樹的帶權路徑長度最小,稱這棵樹為「最優二叉樹」,有時也叫「哈夫曼樹」或者「赫夫曼樹」。

在構建哈弗曼樹時,要使樹的帶權路徑長度最小,只需要遵循一個原則,那就是:權重越大的結點離樹根越近。

需要注意的是,同樣恭弘=叶 恭弘子結點所構成的哈夫曼樹可能不止一顆,在同一層,左右恭弘=叶 恭弘子節點交換位置,樹的帶權路徑長度是一樣的,就比如下面這兩個哈夫曼樹:

哈弗曼樹的構建過程

那麼如何構建一個哈夫曼樹呢?我們這裏舉個例子,比如我們有這麼幾個恭弘=叶 恭弘子節點:3,4,7,9,13,15,17:

第一步:選出兩個最小的權值,對應的兩個結點組成一個新的二叉樹,且新二叉樹的根結點的權值為左右孩子權值的和:

第二步:從隊列中移除上一步選擇的兩個最小結點,把新的父節點加入隊列,也就是從隊列中刪除 3 和 4 ,插入 7 ,並且仍然保持隊列的升序:

第三步:選擇當前權值最小的兩個結點,生成新的父結點。

這一步其實是在重複上一步操作,當前隊列中最小的節點是 7 和 7 ,生成新的父結點權值是 7 + 7 = 14 :

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

第四步:從隊列中移除上一步選擇的兩個最小結點,把新的父節點加入隊列。

這一步依然是在重複,從隊列中刪除 7 和 7 ,加入 14 ,並且仍然保持隊列的升序:

第五步:選擇當前權值最小的兩個結點,生成新的父結點。

這一步還是重複操作。當前隊列中權值最小的結點是 9 和 14 ,生成新的父結點權值是 9 + 14 = 23 :

第六步:從隊列中移除上一步選擇的兩個最小結點,把新的父節點加入隊列。

這一步依然是在重複,從隊列中刪除 9 和 14 ,加入 23 ,並且仍然保持隊列的升序:

第七步:選擇當前權值最小的兩個結點,生成新的父結點。

這一步從隊列中選擇權值最小的結點是 13 和 15 ,生成新的父結點權值是 13 + 15 = 28 :

第八步:從隊列中移除上一步選擇的兩個最小結點,把新的父節點加入隊列。

從隊列中刪除 13 和 15 ,加入 28 ,並且仍然保持隊列的升序:

第九步:選擇當前權值最小的兩個結點,生成新的父結點。

這一步從隊列中選擇權值最小的結點是 17 和 23 ,生成新的父結點權值是 17 + 23 = 40 :

第十步:從隊列中移除上一步選擇的兩個最小結點,把新的父節點加入隊列。

從隊列中刪除 17 和 23 ,加入 40 ,並且仍然保持隊列的升序:

第十一步:選擇當前權值最小的兩個結點,生成新的父結點,移除隊列中的最後兩個節點(懶得畫了,最後兩步並一步)。

這一步從隊列中選擇權值最小的結點是 28 和 40 ,生成新的父結點權值是 28 + 40 = 68 :

此時,我們得到的這棵樹就是哈弗曼樹。

哈夫曼樹就介紹到這裏,下一節,將會介紹哈夫曼樹的用途:哈夫曼編碼。

參考

http://c.biancheng.net/view/3398.html

https://baijiahao.baidu.com/s?id=1663514710675419737&wfr=spider&for=pc

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

python基本操作-文件、目錄及路徑_包裝設計

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

目錄

  • 1 前言
  • 2 文件夾操作
    • 2.1 查詢操作
    • 2.2 創建操作
    • 2.3 刪除操作
    • 2.4 修改操作
  • 3 文件操作
    • 3.1 查詢操作
    • 3.2 創建操作
    • 3.3 修改操作
    • 3.4 刪除
  • 4 路徑操作
  • 5 示例應用
    • 5.1 批量修改文件名
    • 5.2 遍歷目錄及子目錄下所有指定擴展名的文件
    • 5.3 按修改時間排序指定目錄下的文件
  • 6 總結
  • 參考資料
  • 往期文章

使用python的os模塊,簡單方便完成對文件夾、文件及路徑的管理與訪問操作。

1 前言

在最近開發中,經常需要對文件進行讀取、遍歷、修改等操作,想要快速、簡單的完成這些操作,我選擇用 python 。通過 python 的標準內置 os 模塊,只需要幾行代碼,即可完成想要的操作。經過對 os 的使用,本文把 os 模塊的常用的操作進行總結,主要分為以下幾個劃分:

  • 文件夾操作:即文件夾的創建、修改(改名/移動),查詢(查看、遍歷)、刪除等。
  • 文件操作:即文件的創建、修改、讀取、刪除等。
  • (文件夾/文件)路徑操作:即文件夾或文件的路徑操作,如絕對路徑,文件名與路徑分割,擴展名分割等

本文涉及常用 的 os 函數的使用展示,主要使用 python 交互模式下進行代碼說明。後續操作默認已經引入 os 模塊,如下:

import os

2 文件夾操作

以本地 E://pythontest 目錄作為演示目錄,此目錄下當前文件如下:

test
 │ test.txt
 └─test-1
     test-1.txt

testtest-1 是文件夾,test.txttest-1.txt 是文件。

2.1 查詢操作

熟悉 linux 同學應該對 ls / pwd / cd 等操作不陌生,對應的 python 也有對應的方法,主要包括:

  • listdir : 文件及目錄列表
  • getcwd :獲取當前目錄
  • chdir :更換目錄
  • stat :文件及目錄基本信息
  • walk :遞歸遍歷目錄
>>> os.chdir("E://pythontest")  # 更改目錄
>>> os.getcwd()                 # 獲取當前目錄
'E:\\pythontest'
>>> os.listdir("test")          # 文件及目錄列表,相對路徑
['test-1', 'test.txt']          
>>> os.listdir("E://pythontest/test")  # 文件及目錄列表,絕對路徑
['test-1', 'test.txt']
>>> os.stat("test")             # 獲取目錄信息
os.stat_result(st_mode=16895, st_ino=4503599627377599, st_dev=266147611, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1590833033, st_mtime=1590832647, st_ctime=1590832207)
>>> os.stat("test/test.txt")    # 獲取文件信息
os.stat_result(st_mode=33206, st_ino=2251799813692354, st_dev=266147611, st_nlink=1, st_uid=0, st_gid=0, st_size=4, st_atime=1590832653, st_mtime=1590832609, st_ctime=1590832598)

其中 stat 函數返回的是文件或者目錄的基本信息,具體如下:

  • st_mode: inode 保護模式
  • st_ino: inode 節點號。
  • st_dev: inode 駐留的設備。
  • st_nlink: inode 的鏈接數。
  • st_uid: 所有者的用戶ID。
  • st_gid: 所有者的組ID。
  • st_size: 普通文件以字節為單位的大小
  • st_atime: 上次訪問的時間。
  • st_mtime: 最後一次修改的時間。
  • st_ctime: 創建時間。

日常使用中,我們一般使用 st_size 、st_ctime 及 st_mtime 獲取文件大小,創建時間,修改時間。另外,我們看到輸出的時間是秒數,在這裏提一下,關於日期的轉換處理。

(1)秒數轉日期時間格式字符串

>>> import time                              # 引入time模塊
>>> timestruct = time.localtime(1590803070)  # 轉換為時間結構體
>>> print(timestruct)
time.struct_time(tm_year=2020, tm_mon=5, tm_mday=30, tm_hour=9, tm_min=44, tm_sec=30, tm_wday=5, tm_yday=151, tm_isdst=0)
>>> time.strftime("%Y-%m-%d %H:%M:%S",timestruct)   # 格式化時間
'2020-05-30 09:44:30'

(2)格式日期時間字符串轉秒數

>>> import datetime               # 引入datetime模塊
>>> timeobject = datetime.datetime.strptime("2020-05-23 10:00:00","%Y-%m-%d %H:%M:%S") #解析時間字符串為時間對象
>>> timeseconds=time.mktime(timeobject.timetuple())  # 獲取時間秒數
>>> print(int(timeseconds))       # 轉為int显示
1590199200
  • 遍歷操作

    walk 函數對目錄進行遞歸遍歷,返回 root,dirs,files,分別對應當前的遍歷的目錄,此目錄中的子目錄及文件。

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

>>> data = os.walk("test")               # 遍歷test目錄
>>> for root,dirs,files in data:         # 遞歸遍歷及輸出
...    print("root:%s" % root)
...    for dir in dirs:
...       print(os.path.join(root,dir))
...    for file in files:
...       print(os.path.join(root,file))
...
root:test
test\test-1
test\test-2
test\test.txt
root:test\test-1
test\test-1\test-1.txt
root:test\test-2
test\test-2\test-2.txt

2.2 創建操作

  • mkdir :新建單個目錄,若目錄路徑中父目錄不存在,則創建失敗

  • makedirs :新建多個目錄,若目錄路徑中父目錄不存在,則自動創建

>>> os.mkdir("test")
>>> os.mkdir("test1/test1-1")          # 父目錄不存在,報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [WinError 3] 系統找不到指定的路徑。: 'test1/test1-1'
>>> os.makedirs("test1/test1-1")       # 父目錄不存在,自動創建
>>> os.listdir("test1")
['test1-1']

2.3 刪除操作

  • rmdir :刪除單個空目錄,目錄不為空則報錯
  • removedirs : 按路徑刪除遞歸多級空目錄,目錄不為空則報錯
>>> os.rmdir("test1")                         # 若目錄不為空,報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [WinError 145] 目錄不是空的。: 'test1'
>>> os.rmdir("test1/test1-1")
>>> os.removedirs("test1/test1-1")            # 刪除多級空目錄
>>> os.listdir(".")
['test']

由於刪除空目錄的限制,更多的是使用 shutil 模塊中的 rmtree 函數,可以刪除不為空的目錄及其文件。

2.4 修改操作

  • rename :重命名目錄或文件,可修改文件或目錄的路徑(即移動操作),若目標文件目錄不存在,則報錯。
  • renames :重命名目錄或文件,若目標文件目錄不存在,則自動創建
>>> os.makedirs("test1/test1-1")
>>> os.rename("test1/test1-1","test1/test1-2")     # test1-1 修改為test1-2
>>> os.listdir("test1")
['test1-2']
>>> os.rename("test1/test1-2","test2/test2-2")     # 由於test2目錄不存在,報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [WinError 3] 系統找不到指定的路徑。: 'test1/test1-2' -> 'test2/test2-2'
>>> os.renames("test1/test1-2","test2/test2-2")    # renames可自動創建不存在的目錄
>>> os.listdir("test2")
['test2-2']

如果目標路徑文件已經存在,那麼os.rename()和os.renames()都會報錯:FileExistsError: [WinError 183] 當文件已存在時,無法創建該文件。

3 文件操作

3.1 查詢操作

  • open/read/close :文件讀取
  • stat :文件信息,詳細見前面文件夾中的 stat 說明
>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT)  # 打開文件
>>> str_bytes = os.read(f,100)                          # 讀100字節
>>> str = bytes.decode(str_bytes)                       # 字節轉字符串
>>> print(str)
test write data
>>> os.close(f)                                         # 關閉文件

注意 open/read/close 需要一起操作,其中 open 操作需要指定模式,上述是以讀寫模式打開文件,若文件不存在則創建文件。各模式具體如下:

flags — 該參數可以是以下選項,多個使用 “|” 隔開:

  • os.O_RDONLY: 以只讀的方式打開
  • os.O_WRONLY: 以只寫的方式打開
  • os.O_RDWR : 以讀寫的方式打開
  • os.O_NONBLOCK: 打開時不阻塞
  • os.O_APPEND: 以追加的方式打開
  • os.O_CREAT: 創建並打開一個新文件
  • os.O_TRUNC: 打開一個文件並截斷它的長度為零(必須有寫權限)
  • os.O_EXCL: 如果指定的文件存在,返回錯誤
  • os.O_SHLOCK: 自動獲取共享鎖
  • os.O_EXLOCK: 自動獲取獨立鎖
  • os.O_DIRECT: 消除或減少緩存效果
  • os.O_FSYNC : 同步寫入
  • os.O_NOFOLLOW: 不追蹤軟鏈接

3.2 創建操作

前面已提到,使用 open ,指定模式, 若文件不存在,則創建。有點類似 linux 操作中的 touch。

>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT)   # 若文件不存在,則創建
>>> os.close(f)

3.3 修改操作

  • open/write/close :寫入文件內容
  • rename ,renames : 與前面介紹的修改名稱、移動操作一致。
>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT)     # 打開文件
>>> os.write(f,b"test write data")                         # 寫入內容
15
>>> os.close(f)                                   # 關閉文件

3.4 刪除

  • remove :刪除文件,注意不能刪除目錄(使用 rmdir/removedirs)
>>> os.remove("test/test-1")       # 刪除目錄報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [WinError 2] 系統找不到指定的文件。: 'test/test1'
>>> os.remove("test/test.txt")     # 刪除文件
>>> os.listdir("test")
['test-1']

4 路徑操作

在使用文件或目錄過程中,經常需要對文件及目錄路徑進行處理,因此,os 中有一個子模塊 path,專門就是處理路徑操作的。主要有以下操作:

  • abspath :返回絕對路徑
>>> os.path.abspath("test")
'E:\\pythontest\\test'
  • exists :判斷文件或目錄是否存在
>>> os.path.exists("test")
True
>>> os.path.exists("test/test.txt")
False
>>> os.path.exists("test/test-1/test-1.txt")
True
  • isfile/isdir :判斷是否為文件/目錄
>>> os.path.isdir("test")
True
>>> os.path.isfile("test/test-1/test-1.txt")
True
  • basename/dirname:獲取路徑尾部和路徑頭部。其實就是以路徑中最後一個 / 為分割符,分為頭(head) 和尾(tail)兩部分,tail 是 basename 返回的內容,head 是 dirname 返回的內容。經常用於獲取文件名,目錄名等操作
>>> os.path.basename("test/test-1/test-1.txt")   # 文件名
'test-1.txt'
>>> os.path.basename("test/test-1/")     # 空內容
''
>>> os.path.basename("test/test-1")      # 目錄名
'test-1'
>>> os.path.dirname("test/test-1/test-1.txt")   # 文件所在目錄路徑
'test/test-1'
>>> os.path.dirname("test/test-1/")   # 目錄路徑
'test/test-1'
>>> os.path.dirname("test/test-1")   # 父目錄路徑
'test'
  • join :合成路徑,即把兩個參數使用系統路徑分割符進行連接,形成完整路徑。
>>> os.path.join("test","test-1")   # 連接兩個目錄
'test\\test-1'
>>> os.path.join("test\\test-1","test-1.txt")   # 連接目錄與文件名
'test\\test-1\\test-1.txt'
  • split :分割文件名和文件夾,即把 path 以最後一個斜線”/”為分隔符,切割為 head 和 tail ,以 (head, tail) 元組的形勢返回。
>>> os.path.split("test/test-1")     # 分割目錄
('test', 'test-1')
>>> os.path.split("test/test-1/")    # 以/結尾的目錄分割
('test/test-1', '')
>>> os.path.split("test/test-1/test-1.txt")  # 分割文件
('test/test-1', 'test-1.txt')
  • splitext :分割路徑名和文件擴展名,把path 以最後一個擴展名分隔符“.”分割,切割為 head 和 tail ,以 (head, tail) 元組的形勢返回。注意與 split 的區別是分隔符的不同。
>>> os.path.splitext("test/test-1")  
('test/test-1', '')
>>> os.path.splitext("test/test-1/") 
('test/test-1/', '')
>>> os.path.splitext("test/test-1/test-1.txt")  # 區分文件名及擴展名
('test/test-1/test-1', '.txt')
>>> os.path.splitext("test/test-1/test-1.txt.tmp") # 以最後的"."為分割點
('test/test-1/test-1.txt', '.tmp')

5 示例應用

下面以一些平時使用到的場景,對前面的操作函數進行綜合使用。

5.1 批量修改文件名

def batch_rename(dir_path):
    itemlist = os.listdir(dir_path)
    # 獲取目錄文件列表
    for item in itemlist:
        # 連接成完整路徑
        item_path = os.path.join(dir_path, item)
        print(item_path)
        # 修改文件名
        if os.path.isfile(item_path):
            splitext = os.path.splitext(item_path)
            os.rename(item_path, splitext[0] + "-副本" + splitext[1])

5.2 遍歷目錄及子目錄下所有指定擴展名的文件


def walk_ext_file(dir_path,ext):
    # 遍歷
    for root, dirs, files in os.walk(dir_path):
        # 獲取文件名稱及路徑
        for file in files:
            file_path = os.path.join(root, file)
            file_item = os.path.splitext(file_path)
            # 輸出指定擴展名的文件路徑
            if ext == file_item[1]:
                print(file_path)

5.3 按修改時間排序指定目錄下的文件

def sort_file(dir_path):
    # 排序前
    itemlist = os.listdir(dir_path)
    print(itemlist)
    # 正向排序
    itemlist.sort(key=lambda filename: os.path.getmtime(os.path.join(dir_path, filename)))
    print(itemlist)
    # 反向排序
    itemlist.sort(key=lambda filename: os.path.getmtime(os.path.join(dir_path, filename)), reverse=True)
    print(itemlist)
    # 獲取最新修改的文件
    print(itemlist[0])

6 總結

在需要對文件或者目錄進行操作時,python 是一個簡單快速選擇。本文通過 python 的標準內置 os 模塊及子模塊 os.path 的常用方法進行介紹,最後結合使用場景進行綜合使用。相信已經滿足大家對文件及目錄操作的大部分需求。

參考資料

  • python之os模塊:https://www.cnblogs.com/yufeihlf/p/6179547.html
  • Python OS 文件/目錄方法: https://www.runoob.com/python/os-file-methods.html
  • Python os.path() 模塊: https://www.runoob.com/python/python-os-path.html

往期文章

  • MinIO 的分佈式部署
  • 利用MinIO輕鬆搭建靜態資源服務
  • 搞定SpringBoot多數據源(3):參數化變更源
  • 搞定SpringBoot多數據源(2):動態數據源
  • 搞定SpringBoot多數據源(1):多套源策略
  • java開發必學知識:動態代理
  • 2019 讀過的好書推薦

我的公眾號(搜索Mason技術記錄),獲取更多技術記錄:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

一文讓你快速上手 Mockito 單元測試框架_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

前言

在計算機編程中,單元測試是一種軟件測試方法,通過該方法可以測試源代碼的各個單元功能是否適合使用。為代碼編寫單元測試有很多好處,包括可以及早的發現代碼錯誤,促進更改,簡化集成,方便代碼重構以及許多其它功能。使用 Java 語言的朋友應該用過或者聽過 Junit 就是用來做單元測試的,那麼為什麼我們還需要 Mockito 測試框架呢?想象一下這樣的一個常見的場景,當前要測試的類依賴於其它一些類對象時,如果用 Junit 來進行單元測試的話,我們就必須手動創建出這些依賴的對象,這其實是個比較麻煩的工作,此時就可以使用 Mockito 測試框架來模擬那些依賴的類,這些被模擬的對象在測試中充當真實對象的虛擬對象或克隆對象,而且 Mockito 同時也提供了方便的測試行為驗證。這樣就可以讓我們更多地去關注當前測試類的邏輯,而不是它所依賴的對象。

生成 Mock 對象方式

要使用 Mockito,首先需要在我們的項目中引入 Mockito 測試框架依賴,基於 Maven 構建的項目引入如下依賴即可:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.3.3</version>
    <scope>test</scope>
</dependency>

如果是基於 Gradle 構建的項目,則引入如下依賴:

testCompile group: 'org.mockito', name: 'mockito-core', version: '3.3.3'

使用 Mockito 通常有兩種常見的方式來創建 Mock 對象。

1、使用 Mockito.mock(clazz) 方式

通過 Mockito 類的靜態方法 mock 來創建 Mock 對象,例如以下創建了一個 List 類型的 Mock 對象:

List<String> mockList = Mockito.mock(ArrayList.class);

由於 mock 方法是一個靜態方法,所以通常會寫成靜態導入方法的方式,即 List mockList = mock(ArrayList.class)。

2、使用 @Mock 註解方式

第二種方式就是使用 @Mock 註解方式來創建 Mock 對象,使用該方式創需要注意的是要在運行測試方法前使用 MockitoAnnotations.initMocks(this) 或者單元測試類上加上 @ExtendWith(MockitoExtension.class) 註解,如下所示代碼創建了一個 List 類型的 Mock 對象(PS: @BeforeEach 是 Junit 5 的註解,功能類似於 Junit 4 的 @Before 註解。):

/**
 * @author mghio
 * @date: 2020-05-30
 * @version: 1.0
 * @description:
 * @since JDK 1.8
 */
//@ExtendWith(MockitoExtension.class)
public class MockitoTest {

  @Mock
  private List<String> mockList;

  @BeforeEach
  public void beforeEach() {
    MockitoAnnotations.initMocks(this);
  }
}

驗證性測試

Mockito 測試框架中提供了 Mockito.verify 靜態方法讓我們可以方便的進行驗證性測試,比如方法調用驗證、方法調用次數驗證、方法調用順序驗證等,下面看看具體的代碼。

驗證方法單次調用

驗證方法單次調用的話直接 verify 方法后加上待驗證調用方法即可,以下代碼的功能就是驗證 mockList 對象的 size 方法被調用一次。

/**
 * @author mghio
 * @date: 2020-05-28
 * @version: 1.0
 * @description:
 * @since JDK 1.8
 */
@ExtendWith(MockitoExtension.class)
public class MockitoVerifyTest {

  @Mock
  List<String> mockList;

  @Test
  void verify_SimpleInvocationOnMock() {
    mockList.size();
    verify(mockList).size();
  }
}
驗證方法調用指定次數

除了驗證單次調用,我們有時候還需要驗證一些方法被調用多次或者指定的次數,那麼此時就可以使用 verify + times 方法來驗證方法調用指定次數,同時還可以結合 atLeast + atMost 方法來提供調用次數範圍,同時還有 never 等方法驗證不被調用等。

/**
 * @author mghio
 * @date: 2020-05-28
 * @version: 1.0
 * @description:
 * @since JDK 1.8
 */
@ExtendWith(MockitoExtension.class)
public class MockitoVerifyTest {

  @Mock
  List<String> mockList;

  @Test
  void verify_NumberOfInteractionsWithMock() {
    mockList.size();
    mockList.size();

    verify(mockList, times(2)).size();
    verify(mockList, atLeast(1)).size();
    verify(mockList, atMost(10)).size();
  }
}
驗證方法調用順序

同時還可以使用 inOrder 方法來驗證方法的調用順序,下面示例驗證 mockList 對象的 size、add 和 clear 方法的調用順序。

/**
 * @author mghio
 * @date: 2020-05-28
 * @version: 1.0
 * @description:
 * @since JDK 1.8
 */
@ExtendWith(MockitoExtension.class)
public class MockitoVerifyTest {

  @Mock
  List<String> mockList;

  @Test
  void verify_OrderedInvocationsOnMock() {
    mockList.size();
    mockList.add("add a parameter");
    mockList.clear();

    InOrder inOrder = inOrder(mockList);

    inOrder.verify(mockList).size();
    inOrder.verify(mockList).add("add a parameter");
    inOrder.verify(mockList).clear();
  }
}

以上只是列舉了一些簡單的驗證性測試,還有驗證測試方法調用超時以及更多的驗證測試可以通過相關官方文檔探索學習。

驗證方法異常

異常測試我們需要使用 Mockito 框架提供的一些調用行為定義,Mockito 提供了 when(…).thenXXX(…) 來讓我們定義方法調用行為,以下代碼定義了當調用 mockMap 的 get 方法無論傳入任何參數都會拋出一個空指針 NullPointerException 異常,然後通過 Assertions.assertThrows 來驗證調用結果。

/**
 * @author mghio
 * @date: 2020-05-30
 * @version: 1.0
 * @description:
 * @since JDK 1.8
 */
@ExtendWith(MockitoExtension.class)
public class MockitoExceptionTest {

  @Mock
  public Map<String, Integer> mockMap;

  @Test
  public void whenConfigNonVoidReturnMethodToThrowEx_thenExIsThrown() {
    when(mockMap.get(anyString())).thenThrow(NullPointerException.class);

    assertThrows(NullPointerException.class, () -> mockMap.get("mghio"));
  }
}

同時 when(…).thenXXX(…) 不僅可以定義方法調用拋出異常,還可以定義調用方法后的返回結果,比如 when(mockMap.get(“mghio”)).thenReturn(21); 定義了當我們調用 mockMap 的 get 方法並傳入參數 mghio 時的返回結果是 21。這裡有一點需要注意,使用以上這種方式定義的 mock 對象測試實際並不會影響到對象的內部狀態,如下圖所示:

雖然我們已經在 mockList 對象上調用了 add 方法,但是實際上 mockList 集合中並沒有加入 mghio,這時候如果需要對 mock 對象有影響,那麼需要使用 spy 方式來生成 mock 對象。

public class MockitoTest {

  private List<String> mockList = spy(ArrayList.class);

  @Test
  public void add_spyMockList_thenAffect() {
    mockList.add("mghio");

    assertEquals(0, mockList.size());
  }
}

斷點后可以發現當使用 spy 方法創建出來的 mock 對象調用 add 方法后,mghio 被成功的加入到 mockList 集合當中。

與 Spring 框架集成

Mockito 框架提供了 @MockBean 註解用來將 mock 對象注入到 Spring 容器中,該對象會替換容器中任何現有的相同類型的 bean,該註解在需要模擬特定bean(例如外部服務)的測試場景中很有用。如果使用的是 Spring Boot 2.0+ 並且當前容器中已有相同類型的 bean 的時候,需要設置 spring.main.allow-bean-definition-overriding 為 true(默認為 false)允許 bean 定義覆蓋。下面假設要測試通過用戶編碼查詢用戶的信息,有一個數據庫操作層的 UserRepository,也就是我們等下要 mock 的對象,定義如下:

/**
 * @author mghio
 * @date: 2020-05-30
 * @version: 1.0
 * @description:
 * @since JDK 1.8
 */
@Repository
public interface UserRepository {

  User findUserById(Long id);

}

還有用戶操作的相關服務 UserService 類,其定義如下所示:

/**
 * @author mghio
 * @date: 2020-05-30
 * @version: 1.0
 * @description:
 * @since JDK 1.8
 */
@Service
public class UserService {

  private UserRepository userRepository;

  public UserService(UserRepository userRepository) {
    this.userRepository = userRepository;
  }

  public User findUserById(Long id) {
    return userRepository.findUserById(id);
  }
}

在測試類中使用 @MockBean 來標註 UserRepository 屬性表示這個類型的 bean 使用的是 mock 對象,使用 @Autowired 標註表示 UserService 屬性使用的是 Spring 容器中的對象,然後使用 @SpringBootTest 啟用 Spring 環境即可。

/**
 * @author mghio
 * @date: 2020-05-30
 * @version: 1.0
 * @description:
 * @since JDK 1.8
 */
@SpringBootTest
public class UserServiceUnitTest {

  @Autowired
  private UserService userService;

  @MockBean
  private UserRepository userRepository;

  @Test
  public void whenUserIdIsProvided_thenRetrievedNameIsCorrect() {
    User expectedUser = new User(9527L, "mghio", "18288888880");
    when(userRepository.findUserById(9527L)).thenReturn(expectedUser);
    User actualUser = userService.findUserById(9527L);
    assertEquals(expectedUser, actualUser);
  }
}

Mockito 框架的工作原理

通過以上介紹可以發現, Mockito 非常容易使用並且可以方便的驗證一些方法的行為,相信你已經看出來了,使用的步驟是先創建一個需要 mock 的對象 Target ,該對象如下:

public class Target {

  public String foo(String name) {
    return String.format("Hello, %s", name);
  }

}

然後我們直接使用 Mockito.mock 方法和 when(…).thenReturn(…) 來生成 mock 對象並指定方法調用時的行為,代碼如下:

@Test
public void test_foo() {
  String expectedResult = "Mocked mghio";
  when(mockTarget.foo("mghio")).thenReturn(expectedResult);
  String actualResult = mockTarget.foo("mghio");
  assertEquals(expectedResult, actualResult);
}

仔細觀察以上 when(mockTarget.foo(“mghio”)).thenReturn(expectedResult) 這行代碼,首次使用我也覺得很奇怪,when 方法的入參竟然是方法的返回值 mockTarget.foo(“mghio”),覺得正確的代碼應該是這樣 when(mockTarget).foo(“mghio”),但是這個寫法實際上無法進行編譯。既然 Target.foo 方法的返回值是 String 類型,那是不是可以使用如下方式呢?

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

Mockito.when("Hello, I am mghio").thenReturn("Mocked mghio");

結果是編譯通過,但是在運行時報錯:

從錯誤提示可以看出,when 方法需要一個方法調用的參數,實際上它只需要 more 對象方法調用在 when 方法之前就行,我們看看下面這個測試代碼:

@Test
public void test_mockitoWhenMethod() {
  String expectedResult = "Mocked mghio";
  mockTarget.foo("mghio");
  when("Hello, I am mghio").thenReturn(expectedResult);
  String actualResult = mockTarget.foo("mghio");
  assertEquals(expectedResult, actualResult);
}

以上代碼可以正常測試通過,結果如下:

為什麼這樣就可以正常測試通過?是因為當我們調用 mock 對象的 foo 方法時,Mockito 會攔截方法的調用然後將方法調用的詳細信息保存到 mock 對象的上下文中,當調用到 Mockito.when 方法時,實際上是從該上下文中獲取最後一個註冊的方法調用,然後把 thenReturn 的參數作為其返回值保存,然後當我們的再次調用 mock 對象的該方法時,之前已經記錄的方法行為將被再次回放,該方法觸發攔截器重新調用並且返回我們在 thenReturn 方法指定的返回值。以下是 Mockito.when 方法的源碼:

該方法裏面直接使用了 MockitoCore.when 方法,繼續跟進,該方法源碼如下:

仔細觀察可以發現,在源碼中並沒有用到參數 methodCall,而是從 MockingProgress 實例中獲取 OngoingStubbing 對象,這個 OngoingStubbing 對象就是前文所提到的上下文對象。個人感覺是 Mockito 為了提供簡潔易用的 API 然後才製造了 when 方法調用的這種“幻象”,簡而言之,Mockito 框架通過方法攔截在上下文中存儲和檢索方法調用詳細信息來工作的。

如何實現一個微型的 Mock 框架

知道了 Mockito 的運行原理之後,接下來看看要如何自己去實現一個類似功能的 mock 框架出來,看到方法攔截這裏我相信你已經知道了,其實這就是 AOP 啊,但是通過閱讀其源碼發現 Mockito 其實並沒有使用我們熟悉的 Spring AOP 或者 AspectJ 做的方法攔截,而是通過運行時增強庫 Byte Buddy 和反射工具庫 Objenesis 生成和初始化 mock 對象的。
現在,通過以上分析和源碼閱讀可以定義出一個簡單版本的 mock 框架了,將自定義的 mock 框架命名為 imock。這裡有一點需要注意的是,Mockito 有一個好處是,它不需要進行初始化,可以直接通過其提供的靜態方法來立即使用它。在這裏我們也使用相同名稱的靜態方法,通過 Mockito 源碼:

很容易看出 Mockito 類最終都是委託給 MockitoCore 去實現的功能,而其只提供了一些面向使用者易用的靜態方法,在這裏我們也定義一個這樣的代理對象 IMockCore,這個類中需要一個創建 mock 對象的方法 mock 和一個給方法設定返回值的 thenReturn 方法,同時該類中持有一個方法調用詳情 InvocationDetail 集合列表,這個類是用來記錄方法調用詳細信息的,然後 when 方法僅返回列表中的最後一個 InvocationDetail,這裏列表可以直接使用 Java 中常用的 ArrayList 即可,這裏的 ArrayList 集合列表就實現了 Mockito 中的 OngoingStubbing 的功能。
根據方法的三要素方法名、方法參數和方法返回值很容易就可以寫出 InvocationDetail 類的代碼,為了對方法在不同類有同名的情況區分,還需要加上類全稱字段和重寫該類的 equals 和 hashCode 方法(判斷是否在調用方法集合列表時需要根據該方法判斷),代碼如下所示:

/**
 * @author mghio
 * @date: 2020-05-30
 * @version: 1.0
 * @description:
 * @since JDK 1.8
 */
public class InvocationDetail<T> {

  private String attachedClassName;

  private String methodName;

  private Object[] arguments;

  private T result;

  public InvocationDetail(String attachedClassName, String methodName, Object[] arguments) {
    this.attachedClassName = attachedClassName;
    this.methodName = methodName;
    this.arguments = arguments;
  }

  public void thenReturn(T t) {
    this.result = t;
  }

  public T getResult() {
    return result;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    InvocationDetail<?> behaviour = (InvocationDetail<?>) o;
    return Objects.equals(attachedClassName, behaviour.attachedClassName) &&
        Objects.equals(methodName, behaviour.methodName) &&
        Arrays.equals(arguments, behaviour.arguments);
  }

  @Override
  public int hashCode() {
    int result = Objects.hash(attachedClassName, methodName);
    result = 31 * result + Arrays.hashCode(arguments);
    return result;
  }
}

接下來就是如何去創建我們的 mock 對象了,在這裏我們也使用 Byte Buddy 和 Objenesis 庫來創建 mock 對象,IMockCreator 接口定義如下:

/**
 * @author mghio
 * @date: 2020-05-30
 * @version: 1.0
 * @description:
 * @since JDK 1.8
 */
public interface IMockCreator {

  <T> T createMock(Class<T> mockTargetClass, List<InvocationDetail> behaviorList);

}

實現類 ByteBuddyIMockCreator 使用 Byte Buddy 庫在運行時動態生成 mock 類對象代碼然後使用 Objenesis 去實例化該對象。代碼如下:

/**
 * @author mghio
 * @date: 2020-05-30
 * @version: 1.0
 * @description:
 * @since JDK 1.8
 */
public class ByteBuddyIMockCreator implements IMockCreator {

  private final ObjenesisStd objenesisStd = new ObjenesisStd();

  @Override
  public <T> T createMock(Class<T> mockTargetClass, List<InvocationDetail> behaviorList) {
    ByteBuddy byteBuddy = new ByteBuddy();

    Class<? extends T> classWithInterceptor = byteBuddy.subclass(mockTargetClass)
        .method(ElementMatchers.any())
        .intercept(MethodDelegation.to(InterceptorDelegate.class))
        .defineField("interceptor", IMockInterceptor.class, Modifier.PRIVATE)
        .implement(IMockIntercepable.class)
        .intercept(FieldAccessor.ofBeanProperty())
        .make()
        .load(getClass().getClassLoader(), Default.WRAPPER).getLoaded();

    T mockTargetInstance = objenesisStd.newInstance(classWithInterceptor);
    ((IMockIntercepable) mockTargetInstance).setInterceptor(new IMockInterceptor(behaviorList));

    return mockTargetInstance;
  }
}

基於以上分析我們可以很容易寫出創建 mock 對象的 IMockCore 類的代碼如下:

/**
 * @author mghio
 * @date: 2020-05-30
 * @version: 1.0
 * @description:
 * @since JDK 1.8
 */
public class IMockCore {

  private final List<InvocationDetail> invocationDetailList = new ArrayList<>(8);

  private final IMockCreator mockCreator = new ByteBuddyIMockCreator();

  public <T> T mock(Class<T> mockTargetClass) {
    T result = mockCreator.createMock(mockTargetClass, invocationDetailList);
    return result;
  }

  @SuppressWarnings("unchecked")
  public <T> InvocationDetail<T> when(T methodCall) {
    int currentSize = invocationDetailList.size();
    return (InvocationDetail<T>) invocationDetailList.get(currentSize - 1);
  }
}

提供給使用者的類 IMock 只是對 IMockCore 進行的簡單調用而已,代碼如下:

/**
 * @author mghio
 * @date: 2020-05-30
 * @version: 1.0
 * @description:
 * @since JDK 1.8
 */
public class IMock {

  private static final IMockCore IMOCK_CORE = new IMockCore();

  public static <T> T mock(Class<T> clazz) {
    return IMOCK_CORE.mock(clazz);
  }

  public static <T> InvocationDetail when(T methodCall) {
    return IMOCK_CORE.when(methodCall);
  }
}

通過以上步驟,我們就已經實現了一個微型的 mock 框架了,下面來個實際例子測試一下,首先創建一個 Target 對象:

/**
 * @author mghio
 * @date: 2020-05-30
 * @version: 1.0
 * @description:
 * @since JDK 1.8
 */
public class Target {

  public String foo(String name) {
    return String.format("Hello, %s", name);
  }

}

然後編寫其對應的測試類 IMockTest 類如下:

/**
 * @author mghio
 * @date: 2020-05-30
 * @version: 1.0
 * @description:
 * @since JDK 1.8
 */
public class IMockTest {

  @Test
  public void test_foo_method() {
    String exceptedResult = "Mocked mghio";
    Target mockTarget = IMock.mock(Target.class);

    IMock.when(mockTarget.foo("mghio")).thenReturn(exceptedResult);

    String actualResult = mockTarget.foo("mghio");

    assertEquals(exceptedResult, actualResult);
  }

}

以上測試的可以正常運行,達到了和 Mockito 測試框架一樣的效果,運行結果如下:

上面只是列出了一些關鍵類的源碼,自定義 IMock 框架的所有代碼已上傳至 Github 倉庫 imock,感興趣的朋友可以去看看。

總結

本文只是介紹了 Mockito 的一些使用方法,這隻是該框架提供的最基礎功能,更多高級的用法可以去官網閱讀相關的文檔,然後介紹了框架中 when(…).thenReturn(…) 定義行為方法的實現方式並按照其源碼思路實現了一個相同功能的簡易版的 imock 。雖然進行單元測試有很多優點,但是也不可盲目的進行單元測試,在大部分情況下只要做好對項目中邏輯比較複雜、不容易理解的核心業務模塊以及項目中公共依賴的模塊的單元測試就可以了。

參考文章

Mockito
Objenesis
Byte Buddy

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

《演員請就位2》熱搜不斷 婁藝瀟版王漫妮令人心疼_電子煙

※你應該要知道的電子煙懶人包!

芒果鳳梨-熱帶鮮芒與成熟菠蘿在冰塊裡碰撞,猶如夏日里一杯果飲,甜蜜而不失解渴。沙士-純正的啤酒配合麥根的香氣,喜歡喝冰凍啤酒的一定不能錯過。

    騰訊視頻《演員請就位2》第三期於10月17日播出,《三十而已》、《梅蘭芳》等劇目輪番上演,不同演員重新演繹熱門橋段,賦予其全新的靈魂。青年演員婁藝瀟挑戰《三十而已》王漫妮一角,得到導演認可,獲得同組最好成績。

  《三十而已》名場面再現  婁藝瀟挑戰王漫妮一角

  第一輪表演中,婁藝瀟選擇今年熱播劇《三十而已》中王漫妮一角,與原劇梁正賢的扮演者馬志威重現餐廳分手名場面。這段表演中,演員需要在極短的時間內將角色從內斂隱忍到失望釋然的情緒充分表達出來,十分考驗演員的演技。

1.婁藝瀟參演《三十而已》 2.婁藝瀟參加《演員請就位2》  

  在得知梁正賢並沒有打算結婚的意圖后,婁藝瀟的表演從最開始的隱忍甚至抱有一絲希望,逐漸變化為徹底失望的崩潰,但隨後眼神中逐漸透露出的堅強卻讓人瞬間沉浸其中,給大家留下了深刻的印象。網友在看完短短十分鐘的演繹后,紛紛表達出對婁藝瀟版王漫妮的喜愛:“被她演繹出的適度分寸感和令人心疼的自尊心打動”。

高雄外送茶坊行情

隱密安全,信用可靠,不轉帳,不買點數,不詐騙!

  婁藝瀟深刻解讀王漫妮  演出自己風格獲贊

  婁藝瀟在節目中發表自己對王漫妮這一角色的解讀:“丟人的不是脫衣服,而是你對於感情的一個態度。所以我直接脫下一層層的衣服給他,而不是會有不舍。這是我理解的王漫妮。”在節目的排練過程中,婁藝瀟用心揣摩人物心理,將自己的理解加到表演中,使人物形象更加豐富且立體。

3.婁藝瀟《三十而已》 4.婁藝瀟飾演王漫妮  

  結合原劇前後劇情,婁藝瀟選擇用一種收斂的表演方式詮釋這個角色,她認為:“因為這件事已經爆發過了,所以我想這場可能是過來跟他平靜地攤牌,劃清界限。”此次她潛心鑽研劇本,充分表現出了王漫妮的人物性格。爾冬升導演指出“本身這場戲就太一般了,就像一般的電視劇”,雖然劇情平淡,但婁藝瀟演出了自己的風格,是不一樣的感覺。同時,婁藝瀟表示來參加這個節目並不是為了撕掉身上固有的標籤,而是希望通過這個節目貼上更多的標籤,這樣誠懇的發言也獲得了導演的讚譽。

  節目播出后,“婁藝瀟對王漫妮的解讀”登上微博熱搜,引髮網友熱烈討論。原劇王漫妮飾演者江疏影對婁藝瀟的表演點贊,可以看出她對這版全新演繹的關注和認可。

  節目中,趙薇導演說道:“其實我在一些節目和電視上有看見藝瀟,她給我感覺挺有魅力的。一些東西給她去演,給她去表現,她都是讓你特別能夠相信跟進入這個角色”,欣賞之意溢於言表。婁藝瀟在表演上的潛力和能力也曾在電視劇《愛情悠悠藥草香》、《你是我的姐妹》、《愛情珠寶》等劇中得到印證。一起期待她給我們帶來的更多精彩表演。

   網站內容來源:中國娛樂網訊www.yule.com.cn

高雄外送茶坊行情

隱密安全,信用可靠,不轉帳,不買點數,不詐騙!

碧桂園9500.99萬元摘得昆明市崇明縣一宗住宅用地_家具工廠推薦

※挑好磚一點都不難!馬賽克磚挑選眉角小撇步!

以認真精妙的陶瓷創作精神,將藝術傳達到世界上各個角落;
把〝藝術生活化,生活藝術化〞是我們的座右銘。

中國網地產訊  9月22日,雲南省昆明市崇明縣成功出讓一宗住宅用地。最終,雲南開發有限公司以底價9500.99萬元摘得,樓麵價868元/㎡。

※想知道北部最多平價、庫存出清的家具工廠推薦在哪裡?

鑫沅傢俱在早期以生產現代家具為主!
我們為了轉型提升了工廠設備開始做產業鏈裡最難做的新古典家具,因雕刻的美感需要有經驗的工匠而工匠再賦予傢俱新的生命感

資料显示,該地塊編號為SM-J2011(201)-16-D1,位於黃龍大街與文昌路交叉口。出讓面積39098.74㎡,起始價9500.99萬元,競買保證金2851萬元,建築密度≤22%,率≥40%,建築高度≤54米。

(責任編輯:崔瑞婷)
相關閱讀:

中國網地產是中國互聯網新聞中心·中國網旗下地產頻道,是國內官方、權威、專業的國家重點新聞網站。以引導正確的行業輿論導向為己任,為行業上下游關聯企業、相關產業提供一個高效溝通與互動的優質平台。

※新屋購入,尋找台中室內設計師?是否可先免費估價丈量?

『Wood Work Studio沐作空間設計』,取自英文木工施作,台中沐作室內設計公司專注於原木的質感挑選、特色風格打造與提供專業建議,服務範圍包含老宅更新

新城控股聯合體7.15億元摘得重慶市2宗商住用地_木質地板

※家中裝潢適合實木地板嗎?注意五大鋪設狀況

實木地板、海島型木地板、超耐磨木地板 、柚木地板 責任施工、保固

中國網地產訊  9月22日,重慶市成功出讓2宗商住用地。總起始價71530萬元。最終,重慶市江津區新城鴻達開發有限公司(聯合體)以底價摘得2宗地塊。

B13-4/03、B14-5/04號-01地塊成交價34913萬元,樓麵價1515元/㎡。該地塊位於雙福工業園。出讓面積147.5畝,起始價34913萬元,競買保證金6990萬元。其中,B13-4/03地塊建築密度≤35%,率≥30%,建築限高100米;B14-5/04號-01地塊建築密度≤75%,綠地率≥5%,建築限高40米。

E13-7/03、B14-5/04號-02地塊成交價36617萬元,樓麵價1459元/㎡。該地塊位於雙福工業園。出讓面積188.17畝,起始價36617萬元,競買保證金7330萬元。E13-7/03地塊建築密度≤35%,綠地率≥30%,建築限高60米;B14-5/04號-02地塊建築密度≤75%,綠地率≥5%,建築限高40米。

出讓文件显示,競得人須按有關標準分別在B13-4/03號地塊、E13-7/03號地塊臨城市道路區域配套建設不少於1座公共廁所,每個公共廁所建築面積不小於50平方米,建成后無償移交區政府管理。

※分享木質地板DIY自行施工教學影片

手工精雕 歐風橡 立體浮紋系列~5.4寸地板、6.4寸地板、9.2寸壁板、訂製踏板、桌板、層板

競得人須分別在B14-5/04號-01地塊、B14-5/04號-02地塊建設不少於5萬平方米的集中式大型購物中心(不含酒店、辦公、公寓、金街及各類專業市場、地下車庫等業態),且在土地出讓年限內自持並整體運營,不得分割銷售。購物中心須在摘牌后24個月內建成並開業。

為實現片區統一規劃,統一建設、統一運營,競買人須同時報名競買雙福新區B13-4/03、B14-5/04號-01地塊和E13-7/03、B14-5/04號-02地塊兩宗土地,否則視為無效。

上述地塊在簽訂土地出讓合同后5個工作日內現狀交地,交地后3個月內開工,開工后30個月內竣工。

競買人在國內擁有同等體量購物中心的建設招商運營經驗,在國內已建成開業並持有經營的大型綜合購物中心(不包括專業家居建材市場、批發市場、會展演藝遊樂場等)不少於20個,且每個購物中心商業建築面積不低於9萬平方米(不含地下車位)。

(責任編輯:崔瑞婷)
相關閱讀:

中國網地產是中國互聯網新聞中心·中國網旗下地產頻道,是國內官方、權威、專業的國家重點新聞網站。以引導正確的行業輿論導向為己任,為行業上下游關聯企業、相關產業提供一個高效溝通與互動的優質平台。

※推薦沙發修理,老師傅的專業手工!

有單人坐的、雙人或多人坐的,坐著柔軟舒適;是軟件家具的一種

綠地1.76億元摘得青島市黃島區一宗商住用地 樓麵價1705元/㎡_隱形鐵窗

海島型木地板專業木作修繕團隊

實木地板為”天然”木材色澤,花紋以自然為主,請施工者自行分色,挑選後再行施工。

中國網地產訊  9月23日,青島市黃島區以拍賣方式成功出讓一宗商住用地。最終,海逸(青島)置業有限公司以底價17611.361萬元摘得,樓麵價1705元/㎡。

※居家隱形鐵窗安裝施作經驗分享

隨著城市發展,各都會高樓林立,也造成小孩及老人墜樓的意外頻頻發生,新寶隱形鐵窗研發改良高科技產品隱形鐵窗、防墜窗,全部零主件均是『台灣在地生產製造』,品質可靠,用心及推薦提供良好居家安全。

資料显示,該地塊編號為HD2020-3178號,位於黃島區青連鐵路東、玉和路北。土地面積29512.13㎡,規劃建築總面積111667.5㎡,起始價17611.361萬元,建築密度≤35%,綠地率≥30%。

出讓文件显示,該地塊的裝配式建築面積比例須達到30%,其單體裝配率不低於50%。

(責任編輯:崔瑞婷)
相關閱讀:

中國網地產是中國互聯網新聞中心·中國網旗下地產頻道,是國內官方、權威、專業的國家重點新聞網站。以引導正確的行業輿論導向為己任,為行業上下游關聯企業、相關產業提供一個高效溝通與互動的優質平台。

※打造簡約、淡雅兼收納空間的小資房,台中室內設計推薦哪一家?

室內空間裝潢、商業室內設計、木作施工、訂製家具、零售批發家具。客戶與專業工班團隊來回溝通方案,帶著一股職人精神與多年累積的豐富經驗,創造出符合客戶心目中的作品。

廣州市海珠區35.14億元掛牌一宗地塊 於10月23日限時競價_沙發換皮

※了解海島型木地板是否會有潮濕變形疑慮?

結構為在木夾板表面貼實木皮,比實木地板穩定性高、不易變形翹起,「海島型木地板」名稱由來乃是此類地板非常適合灣溫濕多雨的海島型氣候。

中國網地產訊  9月23日,廣州市海珠區掛牌一宗二類居住用地,計劃於10月23日開始限時競價。

資料显示,該地塊公告號為穗規劃資源掛出告字〔2020〕80號,位於海珠區南洲路以北、東曉南路以西。宗地面積34018㎡,計容建築面積≤114847㎡,起始價351409萬元,起拍樓麵價約30597元/㎡,最高限價509550萬元,競買保證金70281.8萬元,增加幅度2000萬元。

沙發換皮省更多,延長老沙發壽命!

沙發是家裡使用頻率最高的家具之一,隨著長時間使用,難免出現表皮磨損、坐墊凹陷等狀況

出讓文件显示,該地塊競得人須按規劃要求配建用地範圍內城市道路和用地,按照該地塊《國有建設用地使用權出讓合同》第十六條約定的竣工時間建成並驗收合格后無償移交廣州市政府相關部門。

競得人須採用裝配式建築的建造方式(獨立用地的公建配套設施除外),裝配式建築面積比例不低於70%,應滿足國家或省現行的裝配式建築評價標準要求。

(責任編輯:崔瑞婷)
相關閱讀:

中國網地產是中國互聯網新聞中心·中國網旗下地產頻道,是國內官方、權威、專業的國家重點新聞網站。以引導正確的行業輿論導向為己任,為行業上下游關聯企業、相關產業提供一個高效溝通與互動的優質平台。

木地板哪有幾種款式?該如何選購適合的材質呢?

家中如想要有實木的感覺,但卻居住在潮濕的地方如海邊、山上,就建議選擇海島型木地板;想有實木質感且居住地乾燥,預算也許可,則可選擇實木地板;家裡有小朋友奔跑遊戲,或有易刮傷木地板的寵物,則建議選擇超耐磨木地板。