Python文件操作(txt\xlsx\csv)及os操作


一、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() 兩個路徑名是否指向同個文件  

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM