7天入門Python 6 — 輸入輸出、文件及OS

專欄自述:隨着這幾年機器學習火爆,樓主寫了Java好多年,python其實也會寫,但是缺乏系統性梳理,所以搞一個python欄目,系統性梳理的同時也把python的知識做一些梳理,歡迎查閱,歡迎一起學習python

傳送門:

 

輸出格式化

Python三種輸出值的方式: 表達式語句和 print() 函數,第三種方式是使用文件對象的 write() 方法,標準輸出文件可以用 sys.stdout 引用。

如果你希望輸出的形式更加多樣,可以使用 str.format() 函數來格式化輸出值。

如果你希望將輸出的值轉成字符串,可以使用 repr() 或 str() 函數來實現。

  • str(): 函數返回一個用戶易讀的表達形式。
  • repr(): 產生一個解釋器易讀的表達形式,函數可以轉義字符串中的特殊字符,並且參數可以是python的任何對象
  • rjust(): 可以將字符串靠右, 並在左邊填充空格。
  • ljust(): 可以將字符串靠左, 並在左邊填充空格。
  • center(): 可以將字符串居中, 並在兩邊填充空格。
  • zfill(): 在數字左邊填充 0
  • str.format(): 將會被 format() 中的參數替換

實例:

import math

print("==========str、repr輸出實例==========");
s = "Hello World"
s1 = "Hello World\n"
# str() 實例
print("str實例:" + str(s))
print("str特殊字符實例:" + str(s1)) #str函數對 \n 會進行換行

# repr() 實例
print("repr實例:" + repr(s))
print("repr特殊字符實例:" + repr(s1))   #repr函數可以轉義字符串中的特殊字符

print("\n==========佔位輸出實例==========")
print("zfill實例:" + '12'.zfill(5))
print("ljust實例:" + '12'.ljust(5) + "#")
print("center實例:" + '12'.center(5) + "#")
print("rjust實例如下:")
for x in range(1, 5):
     print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
     # 注意前一行 'end' 的使用
     print(repr(x*x*x).rjust(4))

print("\n==========str.format() 實例==========")
print('{}網址: "{}!"'.format('百度搜索', 'www.baidu.com'))
#括號中的數字用於指向傳入對象在 format() 中的位置
print('{0} 和 {1}'.format('Google', 'Runoob'))
#括號中的關鍵字參數會指向使用該名字的參數的值
print('{name}網址: {site}'.format(name='百度搜索', site='www.baidu.com'))
#位置及關鍵字參數可以任意的結合
print('站點列表 {0}, {1}, 和 {other}。'.format('Google', 'Runoob', other='Taobao'))
#!a (使用 ascii()), !s (使用 str()) 和 !r (使用 repr()) 可以用於在格式化某個值之前對其進行轉化
print('常量 PI 的值近似爲: {!r}。'.format(math.pi))
#在 : 後傳入一個整數, 可以保證該域至少有這麼多的寬度
print('常量 PI 的值近似爲 {0:.3f}。'.format(math.pi))
table = {'Google': 1, 'Runoob': 2, 'Taobao': 3}
for name, number in table.items():
    print('{0:10} ==> {1:10d} '.format(name, number))
print('Runoob: {0[Runoob]:d}; Google: {0[Google]:d}; Taobao: {0[Taobao]:d}'.format(table))
#也可以通過在 table 變量前使用 ** 來實現相同的功能
print('Runoob: {Runoob:d}; Google: {Google:d}; Taobao: {Taobao:d}'.format(**table))


print("\n==========% 實例==========")
print('常量 PI 的值近似爲:%5.3f。' % math.pi)

輸出結果:

==========str、repr輸出實例==========
str實例:Hello World
str特殊字符實例:Hello World

repr實例:'Hello World'
repr特殊字符實例:'Hello World\n'

==========佔位輸出實例==========
zfill實例:00012
ljust實例:12   #
center實例:  12 #
rjust實例如下:
 1   1    1
 2   4    8
 3   9   27
 4  16   64

==========str.format() 實例==========
百度搜索網址: "www.baidu.com!"
Google 和 Runoob
百度搜索網址: www.baidu.com
站點列表 Google, Runoob, 和 Taobao。
常量 PI 的值近似爲: 3.141592653589793。
常量 PI 的值近似爲 3.142。
Google     ==>          1 
Runoob     ==>          2 
Taobao     ==>          3 
Runoob: 2; Google: 1; Taobao: 3
Runoob: 2; Google: 1; Taobao: 3

==========% 實例==========
常量 PI 的值近似爲:3.142。

 

讀取鍵盤輸入

Python提供了 input() 內置函數從標準輸入讀入一行文本,默認的標準輸入是鍵盤

實例:

#!/usr/bin/python3

str = input("請輸入:");
print ("你輸入的內容是: ", str)

輸入輸出結果:

請輸入:百度搜索
你輸入的內容是:  百度搜索

 

文件操作

創建文件對象

語法:

open(filename, mode)       
# open() 將會返回一個 file 對象
# filename:包含了你要訪問的文件名稱的字符串值。
# mode:決定了打開文件的模式:只讀,寫入,追加等。

完整語法:

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
# file: 必需,文件路徑(相對或者絕對路徑)。
# mode: 可選,文件打開模式,默認讀
# buffering: 設置緩衝
# encoding: 一般使用utf8
# errors: 報錯級別
# newline: 區分換行符
# closefd: 傳入的file參數類型

 

模式彙總

模式 描述
r 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。
rb 以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。
r+ 打開一個文件用於讀寫。文件指針將會放在文件的開頭。
rb+ 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。
w 打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。
wb 以二進制格式打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。
w+ 打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。
wb+ 以二進制格式打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。
a 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。
ab 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。
a+ 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。
ab+ 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。

實例:

#!/usr/bin/python3

# 打開一個文件
f = open("D:\\test.txt", "w")
f.write("來一個簡單的文件測試\n")
# 關閉打開的文件
f.close()

結果:

 

文件對象方法

  • read():讀取一定數目的數據, 然後作爲字符串或字節對象返回

  • readline():讀取單獨的一行,換行符爲 '\n'。f.readline() 如果返回一個空字符串, 說明已經已經讀取到最後一行

  • readlines():返回該文件中包含的所有行

  • write():將 string 寫入到文件中, 然後返回寫入的字符數

  • tell():返回文件對象當前所處的位置, 它是從文件開頭開始算起的字節數

  • seek():改變文件當前的位置, 使用 f.seek(offset, from_what) 函數;from_what 的值, 如果是 0 表示開頭, 如果是 1 表示當前位置, 2 表示文件的結尾;offset 負數表示往前移動,正數表示往後移動

  • close():調用 f.close() 來關閉文件並釋放系統的資源,如果嘗試再調用該文件,則會拋出異常

實例:

#!/usr/bin/python3

# 打開一個文件
f = open("D:\\text.txt", "w+")
for i in range(1, 4):
    f.write("來一個簡單的文件測試{}\n".format(i))


print("========= f.tell實例==========")
print("文件指針位置: {}".format(f.tell()))


print("\n========= f.read實例==========")
#重新調整到文件頭
f.seek(0, 0)
print(f.read())

print("\n========= f.readlines 實例==========")
#重新調整到文件頭
f.seek(0, 0)
lines = f.readlines()
print(lines)
for index, str in enumerate(lines):
    print("行數 {} 內容 {}".format(index, str), end='')

# 關閉打開的文件
f.close()

結果:

========= f.tell實例==========
文件指針位置: 69

========= f.read實例==========
來一個簡單的文件測試1
來一個簡單的文件測試2
來一個簡單的文件測試3


========= f.readlines 實例==========
['來一個簡單的文件測試1\n', '來一個簡單的文件測試2\n', '來一個簡單的文件測試3\n']
行數 0 內容 來一個簡單的文件測試1
行數 1 內容 來一個簡單的文件測試2
行數 2 內容 來一個簡單的文件測試3

Process finished with exit code 0

 

OS 文件/目錄方法

序號

方法 描述
1

os.access(path, mode)     

檢驗權限模式
2 os.chdir(path) 改變當前工作目錄
3 os.chflags(path, flags) 設置路徑的標記爲數字標記。
4 os.chmod(path, mode) 更改權限
5 os.chown(path, uid, gid) 更改文件所有者
6 os.chroot(path) 改變當前進程的根目錄
7 os.close(fd) 關閉文件描述符 fd
8 os.closerange(fd_low, fd_high) 關閉所有文件描述符,從 fd_low (包含) 到 fd_high (不包含), 錯誤會忽略
9 os.dup(fd) 複製文件描述符 fd
10 os.dup2(fd, fd2) 將一個文件描述符 fd 複製到另一個 fd2
11 os.fchdir(fd) 通過文件描述符改變當前工作目錄
12 os.fchmod(fd, mode) 改變一個文件的訪問權限,該文件由參數fd指定,參數mode是Unix下的文件訪問權限。
13 os.fchown(fd, uid, gid) 修改一個文件的所有權,這個函數修改一個文件的用戶ID和用戶組ID,該文件由文件描述符fd指定。
14 os.fdatasync(fd) 強制將文件寫入磁盤,該文件由文件描述符fd指定,但是不強制更新文件的狀態信息。
15 os.fdopen(fd[, mode[, bufsize]]) 通過文件描述符 fd 創建一個文件對象,並返回這個文件對象
16 os.fpathconf(fd, name) 返回一個打開的文件的系統配置信息。name爲檢索的系統配置的值,它也許是一個定義系統值的字符串,這些名字在很多標準中指定(POSIX.1, Unix 95, Unix 98, 和其它)。
17 os.fstat(fd) 返回文件描述符fd的狀態,像stat()。
18 os.fstatvfs(fd) 返回包含文件描述符fd的文件的文件系統的信息,Python 3.3 相等於 statvfs()。
19 os.fsync(fd) 強制將文件描述符爲fd的文件寫入硬盤。
20 os.ftruncate(fd, length) 裁剪文件描述符fd對應的文件, 所以它最大不能超過文件大小。
21 os.getcwd() 返回當前工作目錄
22 os.getcwdu() 返回一個當前工作目錄的Unicode對象
23 os.isatty(fd) 如果文件描述符fd是打開的,同時與tty(-like)設備相連,則返回true, 否則False。
24 os.lchflags(path, flags) 設置路徑的標記爲數字標記,類似 chflags(),但是沒有軟鏈接
25 os.lchmod(path, mode) 修改連接文件權限
26 os.lchown(path, uid, gid) 更改文件所有者,類似 chown,但是不追蹤鏈接。
27 os.link(src, dst) 創建硬鏈接,名爲參數 dst,指向參數 src
28 os.listdir(path) 返回path指定的文件夾包含的文件或文件夾的名字的列表。
29 os.lseek(fd, pos, how) 設置文件描述符 fd當前位置爲pos, how方式修改: SEEK_SET 或者 0 設置從文件開始的計算的pos; SEEK_CUR或者 1 則從當前位置計算; os.SEEK_END或者2則從文件尾部開始. 在unix,Windows中有效
30 os.lstat(path) 像stat(),但是沒有軟鏈接
31 os.major(device) 從原始的設備號中提取設備major號碼 (使用stat中的st_dev或者st_rdev field)。
32 os.makedev(major, minor) 以major和minor設備號組成一個原始設備號
33 os.makedirs(path[, mode]) 遞歸文件夾創建函數。像mkdir(), 但創建的所有intermediate-level文件夾需要包含子文件夾。
34 os.minor(device) 從原始的設備號中提取設備minor號碼 (使用stat中的st_dev或者st_rdev field )。
35 os.mkdir(path[, mode]) 以數字mode的mode創建一個名爲path的文件夾.默認的 mode 是 0777 (八進制)。
36 os.mkfifo(path[, mode]) 創建命名管道,mode 爲數字,默認爲 0666 (八進制)
37 os.mknod(filename[, mode=0600, device]) 創建一個名爲filename文件系統節點(文件,設備特別文件或者命名pipe)。
38 os.open(file, flags[, mode]) 打開一個文件,並且設置需要的打開選項,mode參數是可選的
39 os.openpty() 打開一個新的僞終端對。返回 pty 和 tty的文件描述符。
40 os.pathconf(path, name) 返回相關文件的系統配置信息。
41 os.pipe() 創建一個管道. 返回一對文件描述符(r, w) 分別爲讀和寫
42 os.popen(command[, mode[, bufsize]]) 從一個 command 打開一個管道
43 os.read(fd, n) 從文件描述符 fd 中讀取最多 n 個字節,返回包含讀取字節的字符串,文件描述符 fd對應文件已達到結尾, 返回一個空字符串。
44 os.readlink(path) 返回軟鏈接所指向的文件
45 os.remove(path) 刪除路徑爲path的文件。如果path 是一個文件夾,將拋出OSError; 查看下面的rmdir()刪除一個 directory。
46 os.removedirs(path) 遞歸刪除目錄。
47 os.rename(src, dst) 重命名文件或目錄,從 src 到 dst
48 os.renames(old, new) 遞歸地對目錄進行更名,也可以對文件進行更名。
49 os.rmdir(path) 刪除path指定的空目錄,如果目錄非空,則拋出一個OSError異常。
50 os.stat(path) 獲取path指定的路徑的信息,功能等同於C API中的stat()系統調用。
51 os.stat_float_times([newvalue]) 決定stat_result是否以float對象顯示時間戳
52 os.statvfs(path) 獲取指定路徑的文件系統統計信息
53 os.symlink(src, dst) 創建一個軟鏈接
54 os.tcgetpgrp(fd) 返回與終端fd(一個由os.open()返回的打開的文件描述符)關聯的進程組
55 os.tcsetpgrp(fd, pg) 設置與終端fd(一個由os.open()返回的打開的文件描述符)關聯的進程組爲pg。
56

os.tempnam([dir[, prefix]])

Python3 中已刪除。返回一個打開的模式爲(w+b)的文件對象 .這文件對象沒有文件夾入口,沒有文件描述符,將會自動刪除。
57

os.tmpfile()

Python3 中已刪除。返回一個打開的模式爲(w+b)的文件對象 .這文件對象沒有文件夾入口,沒有文件描述符,將會自動刪除。
58

os.tmpnam()

Python3 中已刪除。爲創建一個臨時文件返回一個唯一的路徑
59 os.ttyname(fd) 返回一個字符串,它表示與文件描述符fd 關聯的終端設備。如果fd 沒有與終端設備關聯,則引發一個異常。
60 os.unlink(path) 刪除文件路徑
61 os.utime(path, times) 返回指定的path文件的訪問和修改的時間。
62 os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]]) 輸出在文件夾中的文件名通過在樹中游走,向上或者向下。
63 os.write(fd, str) 寫入字符串到文件描述符 fd中. 返回實際寫入的字符串長度
64 os.path 模塊 獲取文件的屬性信息。

 

 

pickle 模塊

python的pickle模塊實現了基本的數據序列和反序列化。通過pickle模塊的序列化操作我們能夠將程序中運行的對象信息保存到文件中去,永久存儲;通過pickle模塊的反序列化操作,我們能夠從文件中創建上一次程序保存的對象。

# 將對象 obj 序列化到 file,採用 protocol,protocol可不傳,默認0
pickle.dump(obj, file, [,protocol])
# 將file 內容反序列成對象
x = pickle.load(file)

寫入:

#!/usr/bin/python3
import pickle

# 使用pickle模塊將數據對象保存到文件
data1 = {'a': [1, 2.0, 3, 4 + 6j],
         'b': ('string', u'Unicode string'),
         'c': None}

data2 = [1, 2, 3]
data2.append(data2)

output = open('data.pkl', 'wb')

# protocol默認0,採用協議 0
pickle.dump(data1, output)

pickle.dump(data2, output, -1)

output.close()

讀出:

#!/usr/bin/python3
import pprint, pickle

#使用pickle模塊從文件中重構python對象
pkl_file = open('data.pkl', 'rb')

data1 = pickle.load(pkl_file)
pprint.pprint(data1)

data2 = pickle.load(pkl_file)
pprint.pprint(data2)

pkl_file.close()

輸出:

{'a': [1, 2.0, 3, (4+6j)], 'b': ('string', 'Unicode string'), 'c': None}
[1, 2, 3, <Recursion on list with id=2040109095880>]

 

下一篇:待完善

 

感興趣的同學可以點關注哦,持續更新~

 

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