一、OS模塊
os模塊用來直接調用操作系統提供的接口函數,進而操作文件和目錄。
1.1 常用路徑的方法
sys.path[0] 是指運行main的路徑,就是主路徑
os.path.dirname(os.path.abspath("__file__")) 當前運行文件的路徑
os.path.dirname(__file__) 當前運行文件的路徑
os.path.dirname(os.path.realpath(sys.argv[0])) linux系統下表示當前運行文件的路徑
os.path.pardir 上一級目錄
os.path.join(path,'filename') 組合路徑和文件名 形成文件路徑
sys.path.append()
- 備注:假設a.py中有表示路徑的方式,main.py為主調動模塊,當main.py調用a.py時,a.py中表示的路徑則應該以main.py為標准而不是以a.py為標准
import os
#當前文件的完整路徑名:C:\Python27\Scripts\djangotest\justtest.py print os.path.dirname(os.path.dirname(__file__) #獲取當前文件所在目錄的上級目錄C:\Python27\Scripts print os.path.dirname(__file__) #獲取當前文件所在目錄C:\Python27\Scripts\djangotest print os.getcwd() #獲取當前文件目錄 C:\Python27\Scripts\djangotest print os.path.dirname(r'd:\workspace\R') #獲取指定目錄的上級目錄d:\workspace #獲取相對路徑 print os.path.basename(__file__) #獲取當前文件名稱 justtest.py print os.path.basename(r'd:\workspace\R') #獲取指定目錄的相對路徑,即當前目錄名:R
#獲取絕對路徑 print os.path.abspath(__file__) #獲取當前文件的絕對路徑C:\Python27\Scripts\djangotest\justtest.py print os.path.abspath(r'd:\workspace\R') #獲取指定目錄的絕對路徑d:\workspace\R
| os.name | 輸出字符串指示正在使用的平台,window用nt表示,Linux/unix用posix表示 | |
| os.getcwd() | 得到當前工作目錄,即當前python腳本工作的目錄路徑 | |
| os.listdir() | 返回指定目錄下的所有文件和目錄名,返回列表[] | os.listdir(os.getcwd()) |
| os.remove() | 刪除一個文件 | |
| os.system() | 運行shell命令 | os.system('dir') os.system('cmd') |
| os.sep | 可以取代操作系統特定的路徑分割符 | windows \ |
| os.linesep | 字符串給出當前平台使用的行終止符 | windows使用\r\n,linux使用\n,mac使用\r |
| os.path.split() | 返回一個路徑的目錄名和文件名 | os.path.split('c:\python27\abc.txt') ('c\python27','abc.txt') |
| os.path.isfile()/os.path.isdir() | 分別檢驗出路徑是一個文件還是目錄,返回布爾值 | os.path.isdir(os.getcwd()) os.path.isfile('a.txt') |
| os.path.exists() | 檢驗給出的路徑是否真實存在,返回布爾值 | os.path.exists('c:\python27') |
| os.path.abspath(name) | 獲得絕對路徑 | |
| os.path.normpath(path) | 規范path字符串形式 | |
| os.path.getsize(name) | 獲得文件大小,如果name是目錄返回0L | |
| os.path.splitext() | 分離文件名與擴展名 | os.path.splitext('a.txt')-> ('a','.txt') |
| os.path.join(path,name) | 連接目錄與文件名或目錄 | os.paht.join('c:\python','a.txt')->'c:\python\a.txt' |
| os.path.basename(path) | 返回文件名,path填入文件名或路徑名 | os.path.basename('c:\python27\a.txt')->'a.txt' |
| os.path.dirname(path) | 返回路徑名 | os.path.dirname('c:\python\a.txt')->'c:\python' |
二、標准OS流
stdin, stdout, stderr在Python中都是文件屬性的對象,他們在Python啟動時自動與Shell環境中的標准輸入,輸出,出錯 關聯。
sys.stdin 標准輸入
sys.stdout 標准輸出
sys.stderr 錯誤輸出
1.sys.stdin 數據輸入標准源
2.sys.stdout 數據一般出現在屏幕上
3.sys.stderr 錯誤信息,如棧追蹤
print obj ->實際上是-> sys.stdout.write(obj+'\n') ->默認輸出到控制台 sys.stdout=__cosole__
->重定向輸出 f=open('out.log','w') sys.stdout=f
input()/raw_input('promtion') ->實際上是-> print 'promotion'
sys.stdin.readline()[:-1]
3.管道輸出
stdin 標准輸入(鍵盤)
stdout 標准輸出(緩沖輸出到顯示器)
stderr 標准錯誤 (非緩沖輸出到屏幕)
在一個命令后面續寫其他的多個命令,管道符號| 將一個命令的標准輸出和下一個命令的標准輸入連在一起
$cat file.txt | python script.py | sort
cat file.tex【 標准輸出(sys.stdout)】--->script.py讀取【file.txt寫入的】再輸出【sys.stdout】--->sort得到script.py輸出的數據,再輸出
管道script.py 會從它的sys.stdin中讀取數據(file.txt寫入的),並把結果寫入sys.stdout(sort在此得到數據)
三、操作文件
3.1 打開文件
open()內建函數,返回一個文件對象,open()和file()功能相同
3.1.1定義
open(name[,mode[,buffering]]) #name為文件名, mode模式和buffering緩沖為可選
3.1.2 解釋定義
mode模式 ===》'r','w','a','b','+'分別為讀(默認模式)、寫(先清空再寫入)、追加、二進制訪問、讀寫
rU -> 以讀方式打開,同時提供通用換行符支持
bufferring ===》 0或False-無緩沖,直接針對硬盤
1或True-有緩沖,使用內存代替硬盤
大於1的數字-緩沖區的大小
任意負數或不提供-使用默認的緩沖區大小
3.1.3例子
f=open(r'C:\text\somefile.txt') #打開某路徑下的txt文件,以讀方式打開
3.2 寫入
f=open('file.txt','w')
f.write('Hello') #所提供的參數string會被追加到文件中已存在部分的后面
f.write('world!')
f.close
3.3 讀取
f=open('file.txt','r') #可以省略r,因為r是默認的模式
f.read(4) #讀取四個字符,返回讀取的值
f.read() #讀取剩余的字符,返回剩余的值
f.read(-1) #讀取所有
f.read() #讀取文件中的所有字符,返回字符串形式
3.4 讀寫行
x=f.readline() 讀取一行,帶數字參數則返回讀取的字符的最大值
x=f.readline(-1) 讀取所有行
x=f.readlines() 讀取文件的所有行並返回包括換行符,返回的是字符串列表,x[0]為第一行內容
x=f.writelines() 所有的字符串寫入文件,包括換行符 \n(linux) \r(mac) \r\n(windows)符號用來換行 --------由os.linesep決定
3.5 關閉文件
方法1
f.close()
方法2
with open('file.txt') as somefile:
do_something(somefile) #執行完with語句后會自動關閉文件
3.6 關於換行
Unix文件中的換行用\n表示
Windows文件中的換行用\r\n表示
Mac文件中的換行用\r表示
unix/mac中的文件在windows中打開,所有文字會變成一行
windows中的文件在unix/mac中打開,每行行尾多出一個^M符號
例子
f=open('/tmp/x','w+')
f.tell() 輸出當前位置 0
f.wirte('test line\n') 寫入字符串
f.tell() 輸出光標當前位置10
f.seek(-6,1) 光標往前6個字符得長度
f.readline() 讀取行
f.close()
.read() 每次讀取整個文件,它通常用於將文件內容放到一個字符串變量中
.readlines() 一次讀取整個文件(類似於 .read()
.readlines() 自動將文件內容分析成一個行的列表,該列表可以由 Python 的 for ... in ... 結構進行處理.
.readline() 每次只讀取一行,通常比 .readlines() 慢得多。僅當沒有足夠內存可以一次讀取整個文件時,才應該使用 .readline()。
四、操作excel
讀取excel文件可以用兩個模塊xlrd(讀取)和xlwt(寫入)即可
4.1 安裝xlrd
方法1、到python官網http://pypi.python.org/pypi/xlrd下載模塊。下載的文件例如:xlrd-0.9.3.tar.gz。解壓放到python27/Lib/site-packages目錄下
方法2、用命令安裝 easy_install xlrd或者pip install xlrd
4.2 使用xlrd
4.2.1 導入模塊
import xlrd
4.2.2 打開excel
myWorkbook=xlrd.open_workbook('D:\\Daisy\GDCAuto\\testfile\\testData.xls')
4.2.3 獲取excel工作表
mySheets=myWorkbook.sheets() #獲取工作列表,獲取表格中所有sheet,通過索引順序獲取,所有sheet中的第一個sheet
mySheet = mySheets[0]
mySheet = myWorkbook.sheet_by_index(0) #通過索引順序獲取,獲取到表格中第一個sheet
mySheet = myWorkbook.sheet_by_name(u'Sheet1') #通過名稱獲取,獲取到表格中的sheet名稱為xxx的sheet
4.2.4 獲取行數
nrows=mySheet.nrows #獲取sheet中的行數
ncols=mySheet.ncols #獲取sheet中的列數
4.2.5 獲取一行和一列的數據
myrow=mySheet.row_values(i) #i為行數,從0開始計數,返回list對象
mycol=mySheet.col_values(i) #i為列數,從0開始計數,返回list對象
4.2.6 讀取單元格的數據
mycell=mySheet.cell(i,j) #獲取行數i,列數j的單元格
mycellvalue=mycell.value #獲取單元格的數據
myCellValue = mySheet.cell_value(i, j) #直接獲取單元格數據
value=mySheet.cell_value(1,0).encode('utf-8') #以utf-8格式讀取
4.2.7 讀取日期格式的數據 1990/01/07
date_value=xlrd.xldate_as_tuple(sheet.cell_value(1,2),myWorkbook.datemode) //(1990,1,7,0,0,0)
date(*date_value[:3]) //datetime.date(1990,1,7)
date(*date_value[:3]).strftime('%Y%m%d') //'1990/01/07'
python讀取excel中單元格的內容返回有5種類型的數據ctype
0:empty
1:string
2:number
3:date
4:boolean
5:error
即date的ctype=3
if (sheet.cell(row,col).ctype == 3):
date_value = xlrd.xldate_as_tuple(sheet.cell_value(1,3),myWorkbook.datemode)
date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')
4.2.8 讀取合並單元格內容
只能獲取合並單元格的第一個cell的行列索引,才能讀到值

讀取好朋友:sheet2.col_values(4)[1]
讀取暫無:sheet2.row_values(7)[2]
獲取合並的單元格:
讀取文件的時候需要將formatting_info參數設置為True,默認是False
workbook = xlrd.open_workbook(r'F:\demo.xlsx',formatting_info=True)
sheet2 = workbook.sheet_by_name('sheet2')
sheet2.merged_cells //返回[(7, 8, 2, 5), (1, 3, 4, 5), (3, 6, 4, 5)],(7, 8, 2, 5)的意思是第7行到7行,第2列到第4列合並為‘暫無’。
sheet2.cell_value(7,2) //返回(7, 8, 2, 5)合並的內容 ‘暫無’
4.3 安裝xlwt
方法1、到python官網http://pypi.python.org/pypi/xlwt下載模塊。下載的文件例如:xlwt-1.0.0.tar.gz。解壓放到python27/Lib/site-packages目錄下
方法2、用命令安裝 easy_install xlwt或者pip install xlwt
4.4 使用xlwt
4.4.1 導入模塊
import xlwt
4.4.2 創建Excel工作簿
myWorkbook=xlwt.Workbook()
4.4.3 添加excel工作表
mySheet = myWorkbook.add_sheet('A Test Sheet')
4.4.4 寫入數據
myStyle = xlwt.easyxf('font: name Times New Roman, color-index red, bold on', num_format_str='#,##0.00') #數據格式
mySheet.write(i, j, 1234.56, myStyle)
mySheet.write(2, 0, 1) #寫入A3,數值等於1
mySheet.write(2, 1, 1) #寫入B3,數值等於1
mySheet.write(2, 2, xlwt.Formula("A3+B3")) #寫入C3,數值等於2(A3+B3)
4.4.5 保存
myWorkbook.save('excelFile.xls')
4.4.6 高級使用方法
f = xlwt.Workbook()
sheet1 = f.add_sheet(u'sheet1',cell_overwrite_ok=True) #單元格有被覆蓋的時候不會提示錯誤
row0 = [u'業務',u'狀態',u'北京',u'上海',u'廣州',u'深圳',u'狀態小計',u'合計']
column0 = [u'機票',u'船票',u'火車票',u'汽車票',u'其它']
status = [u'預訂',u'出票',u'退票',u'業務小計']
for i in range(0,len(row0)):
sheet1.write(0,i,row0[i],set_style('Times New Roman',220,True))
i, j = 1, 0
while i < 4*len(column0) and j < len(column0):
sheet1.write_merge(i,i+3,0,0,column0[j],set_style('Arial',220,True)) #第一列,i表示行,i+3中的3表示跨3行,0為列,column0[j]表示單元格內容
sheet1.write_merge(i,i+3,7,7) #最后一列"合計",
i += 4
j += 1
sheet1.write_merge(21,21,0,1,u'合計',set_style('Times New Roman',220,True))
i = 0
while i < 4*len(column0):
for j in range(0,len(status)):
sheet1.write(j+i+1,1,status[j])
i += 4
f.save('demo1.xlsx')
def set_style(name,height,bold=False):
style = xlwt.XFStyle() # 初始化樣式
font = xlwt.Font() # 為樣式創建字體
font.name = name # 'Times New Roman'
font.bold = bold
font.color_index = 4
font.height = height
style.font = font
return style

4.5 xlsxwriter模塊
4.5.1 安裝
pip install xlsxwriter
4.5.2 使用
import xlsxwriter
import xlsxwriter
workbook = xlsxwriter.Workbook('hello.xlsx') # 建立文件
worksheet = workbook.add_worksheet() # 建立sheet, 可以work.add_worksheet('employee')來指定sheet名,但中文名會報UnicodeDecodeErro的錯誤
worksheet.write('A1', 'Hello world') # 向A1寫入
workbook.close()
其他使用方法:
formatHeader=workbook.add_format()#添加一種格式
formatHeader.set_bg_color("yellow") #背景顏色變成黃色
formatHeader.set_bold() #把字體加粗
formatHeader.set_font_color('blue')#字體顏色變為藍色
formatHeader.set_align("center")#文本居中
formatHeader.set_align("vcenter")
worksheet.write_row(0,0,[cat1,cat2,cat3],formatHeader)
worksheet.freeze_panes(1,0)
參考資料:https://xlsxwriter.readthedocs.io/contents.html
五、操作json文件
讀取json文件
import json
f=open(''filepath","rb+")
content=json.loads(f.read())
f.close()
六、操作csv文件
6.1 定義
python中有一個讀寫csv文件的包,直接import csv即可。
csv文件的性質:
- 值沒有類型,所有值都是字符串
- 不能指定字體顏色等樣式
- 不能指定單元格的寬高,不能合並單元格
- 沒有多個工作表
- 不能嵌入圖像圖表
在CSV文件中,以,作為分隔符,分隔兩個單元格。像這樣a,,c表示單元格a和單元格c之間有個空白的單元格。依此類推。
excel形式

存儲為csv文件

假設上述csv文件保存為"A.csv",如何用Python像操作Excel一樣提取其中的一列,即一個字段,利用Python自帶的csv模塊,有兩種方法可以實現:
第一種方法使用reader函數,接收一個可迭代的對象(比如csv文件),能返回一個生成器,就可以從其中解析出csv的內容:比如下面的代碼可以讀取csv的全部內容,以行為單位: with open('A.csv','rb') as csvfile:得到:
reader = csv.reader(csvfile)
rows= [row for row in reader]
print rows ['1', 'Apple', '12', '98'],
['2', 'Ben', '13', '97'],
['3', 'Celia', '14', '96'],
['4', 'Dave', '15', '95']]
要提取其中某一列,可以用下面的代碼:with open('A.csv','rb') as csvfile:得到:
reader = csv.reader(csvfile)
column = [row[2] for row in reader]
print column 注意從csv讀出的都是str類型。這種方法要事先知道列的序號,比如Age在第2列,而不能根據'Age'這個標題查詢。這時可以采用第二種方法:
第二種方法是使用DictReader,和reader函數類似,接收一個可迭代的對象,能返回一個生成器,但是返回的每一個單元格都放在一個字典的值內,而這個字典的鍵則是這個單元格的標題(即列頭)。用下面的代碼可以看到DictReader的結構:with open('A.csv','rb') as csvfile:得到:
reader = csv.DictReader(csvfile)
column = [row for row in reader]
print column {'Age': '13', 'No.': '2', 'Score': '97', 'Name': 'Ben'},
{'Age': '14', 'No.': '3', 'Score': '96', 'Name': 'Celia'},
{'Age': '15', 'No.': '4', 'Score': '95', 'Name': 'Dave'}]
如果我們想用DictReader讀取csv的某一列,就可以用列的標題查詢:with open('A.csv','rb') as csvfile:就得到:
reader = csv.DictReader(csvfile)
column = [row['Age'] for row in reader]
print column['12', '13', '14', '15']
讀取行
方法一:reader
第一種方法使用reader函數,接收一個可迭代的對象(比如csv文件),能返回一個生成器,就可以從其中解析出csv的內容:比如下面的代碼可以讀取csv的全部內容,以行為單位:
import csv with open('A.csv','rb') as csvfile: reader = csv.reader(csvfile) rows = [row for row in reader] print rows
得到:
[['No.', 'Name', 'Age', 'Score'],
['1', 'Apple', '12', '98'], ['2', 'Ben', '13', '97'], ['3', 'Celia', '14', '96'], ['4', 'Dave', '15', '95']]
要提取其中第二行,可以用下面的代碼:
import csv with open('A.csv','rb') as csvfile: reader = csv.reader(csvfile) for i,rows in enumerate(reader): if i == 2: row = rows print row
得到:
['2', 'Ben', '13', '97']
這種方法是通用的方法,要事先知道行號,比如Ben的記錄在第2行,而不能根據’Ben’這個名字查詢。這時可以采用第二種方法:
方法二:DictReader
第二種方法是使用DictReader,和reader函數類似,接收一個可迭代的對象,能返回一個生成器,但是返回的每一個單元格都放在一個字典的值內,而這個字典的鍵則是這個單元格的標題(即列頭)。用下面的代碼可以看到DictReader的結構:
import csv with open('A.csv','rb') as csvfile: reader = csv.DictReader(csvfile) rows = [row for row in reader] print rows
得到:
[{'Age': '12', 'No.': '1', 'Score': '98', 'Name': 'Apple'}, {'Age': '13', 'No.': '2', 'Score': '97', 'Name': 'Ben'}, {'Age': '14', 'No.': '3', 'Score': '96', 'Name': 'Celia'}, {'Age': '15', 'No.': '4', 'Score': '95', 'Name': 'Dave'}]
如果我們想用DictReader讀取csv的某一列,就可以用列的標題查詢:
import csv with open('A.csv','rb') as csvfile: reader = csv.DictReader(csvfile) for row in reader: if row['Name']=='Ben': print row
就得到:
{'Age': '13', 'No.': '2', 'Score': '97', 'Name': 'Ben'}
可見,DictReader很適合讀取csv的的行(記錄)。
最常用的一種方法,利用pandas包
import pandas as pd #任意的多組列表 a = [1,2,3] b = [4,5,6] #字典中的key值即為csv中列名 dataframe = pd.DataFrame({'a_name':a,'b_name':b}) #將DataFrame存儲為csv,index表示是否顯示行名,default=True dataframe.to_csv("test.csv",index=False,sep='')
a_name b_name 0 1 4 1 2 5 2 3 6
同樣pandas也提供簡單的讀csv方法
import pandas as pd data = pd.read_csv('test.csv')
會得到一個DataFrame類型的data,不熟悉處理方法可以參考pandas十分鍾入門
另一種方法用csv包,一行一行寫入
import csv
#python2可以用file替代open
with open("test.csv","w") as csvfile: writer = csv.writer(csvfile) #先寫入columns_name writer.writerow(["index","a_name","b_name"]) #寫入多行用writerows writer.writerows([[0,1,3],[1,2,3],[2,3,4]])
index a_name b_name 0 1 3 1 2 3 2 3 4
讀取csv文件用reader
import csv
with open("test.csv","r") as csvfile: reader = csv.reader(csvfile) #這里不需要readlines for line in reader: print line
以上。
1. 讀文件
csv_reader = csv.reader(open('data.file', encoding='utf-8'))
for row in csv_reader:
print(row)
例如有如下的文件

輸出結果如下
['0.093700','0.139771','0.062774','0.007698']
['-0.022711','-0.050504','-0.035691','-0.065434']
['-0.090407','0.021198','0.208712','0.102752']
['-0.085235','0.009540','-0.013228','0.094063']
可見csv_reader把每一行數據轉化成了一個list,list中每個元素是一個字符串。
2. 寫文件
讀文件時,我們把csv文件讀入列表中,寫文件時會把列表中的元素寫入到csv文件中。
list = ['1', '2','3','4']
out = open(outfile, 'w') csv_writer = csv.writer(out) csv_writer.writerow(list)
可能遇到的問題:直接使用這種寫法會導致文件每一行后面會多一個空行。
解決辦法如下:
out = open(outfile, 'w', newline='') csv_writer = csv.writer(out, dialect='excel') csv_writer.writerow(list)
-------------------------------------------------------------------------------------------------------------
file.txt 內容為 your mother was a hamster and your father smelled of elderberries.
script.py內容為
import sys
text=sys.sdin.read()
words=text.split()
wordcount=len(words)
print wordcount
執行 file.txt | python script.py 的結果為11
os模塊 是訪問操作系統功能的主要接口,是文件系統操作的接口
os.path 支持路徑名的操作
| mkfifo()/mknod() | 創建命名管道/創建文件系統節點 | |
| remove()/unlink() | delete file刪除文件 | |
| rename()/renames() | 重命名文件 | |
| stat() | 返回文件信息 | |
| symlink() | 創建符號鏈接 | |
| utime() | 更新時間戳 | |
| tmpfile() | 創建並打開一個新的臨時文件 | |
| walk() | 生成一個目錄樹下的所有文件名 | |
| 目錄/文件夾 | ||
| chdir()/fchdir() | 改變當前工作目錄/通過一個額外你見描述符改變當前工作目錄 | |
| chroot() | 改變當前進程的根目錄 | |
| listdir() | 列出指定目錄的文件 | |
| getcwd()/getcwdu() | 返回當前工作目錄/功能相同,但返回一個unicode對象 | |
| mkdir()/makedirs() | 創建目錄/創建多層目錄 | |
| rmdir()/removedirs() | 刪除目錄/刪除多層目錄 | |
| 訪問/權限 | ||
| access() | 檢驗權限模式 | |
| chmod() | 改變權限模式 | |
| chown()/lchown() | 改變owner和group id/功能相同,但不會跟蹤鏈接 | |
| umask() | 設置默認權限模式 | |
| os.path模塊 | ||
| basename() | 去掉目錄路徑,返回文件名 | |
| dirname() | 去掉文件名,返回目錄路徑 | |
| join() | 將分離的各部分組合成一個路徑名 | |
| split() | 返回(dirname(),basename())元祖 | |
| splitdrive() | 返回(drivename,pahtname)元祖 | |
| splitext() | 返回(filename,extension)元祖 | |
| 信息 | ||
| getatime() | 返回最近訪問時間 | |
| getctime() | 返回文件創建時間 | |
| getmtime() | 返回最近文件修改時間 | |
| getsize() | 返回文件大小 | |
| 查詢 | ||
| exists() | 指定路徑文件或目錄是否存在 | |
| isabs() | 指定路徑是否為絕對路徑 | |
| isdir() | 指定路徑是否存在且為一個目錄 | |
| isfile() | 指定路徑是否存在且為一個文件 | |
| islink() | 指定路徑是否存在且為一個符號鏈接 | |
| ismount() | 指定路徑是否存在且為一個掛載點 | |
| samefile() | 兩個路徑名是否指向同個文件 |
