我的python学习(五)文件操作、异常捕获

读写、创建文件

文件的分类:
文本文件:基于字符编码,存储的是普通字符串,不包括字体、字号、样式、颜色等信息,可通过文本编辑器显示和编辑,例如txt文件;
二进制文件:基于值编码的,以字节形式存储,其编码长度根据值的大小长度可变。通常在文件的头部相关属性中定义表示值的编码长度。例如视频、音频等。

#文件路径操作
path=os.getcwd()    #获取当前脚本的工作路径
os.path.split()   返回一个路径的目录名和文件名
os.path.isdir()   检验给出的路径是否是一个目录
#创建文件
os.mknod(“test.txt”) 创建空文件 
fp = open(“test.txt”,w) 直接打开一个文件,如果文件不存在则创建文件


#打开文件open()函数
file参数:用于指定文件路径,如果只有文件名,则表示在当前文件夹下。以d:\test.txt(D盘下test.txt文件)为例,文件路径中包含特殊字符“\”,为了避免歧义,通常写为r'd:\test.txt';
mode参数:python中文件打开的模式主要涉及到以下字符:w 以写方式打开。
例如
file_object = open(‘thefile.txt’) 
try: 
all_the_text = file_object.read( )  #用try捕获异常,若操作异常则对文件关闭,打开和关闭操作要成对出现。
finally: 
file_object.close( )  

#读取文本文件和二进制文件
file_object = open('data','r')   #第二个参数默认为r
file_object = open('data', 'rb')
output = input.read()     #output是读出来的内容
list_of_all_the_lines = file_object.readlines( ) #读一行

#写数据
file_object = open('test.txt', 'w')
file_object.write(all_the_text)
file_object.close( )

a 以追加模式打开 (从 EOF 开始, 必要时创建新文件) 
r+ 以读写模式打开 
w+ 以读写模式打开 (参见 w ) 
a+ 以读写模式打开 (参见 a ) 
rb 以二进制读模式打开 
wb 以二进制写模式打开 (参见 w ) 
ab 以二进制追加模式打开 (参见 a ) 
rb+ 以二进制读写模式打开 (参见 r+ ) 
wb+ 以二进制读写模式打开 (参见 w+ ) 
ab+ 以二进制读写模式打开 (参见 a+ )

“r+”打开文件时,不会删除原有文件内容,写入时,如果原有位置有内容,则进行覆盖;而“w+”打开文件时,会先删除原有文件内容。


 例如将文件夹中图片的名字改变

import re
import os
import time
#str.split(string)分割字符串
#'连接符'.join(list) 将列表组成字符串
def change_name(path):
    global i
    if not os.path.isdir(path) and not os.path.isfile(path):
        return False
    if os.path.isfile(path):
        file_path = os.path.split(path) #分割出目录与文件
        lists = file_path[1].split('.') #分割出文件与文件扩展名
        file_ext = lists[-1] #取出后缀名(列表切片操作)
        img_ext = ['bmp','jpeg','gif','psd','png','jpg']
        if file_ext in img_ext:
            os.rename(path,file_path[0]+'/'+lists[0]+'_fc.'+file_ext)
            i+=1 #注意这里的i是一个陷阱
        #或者
        #img_ext = 'bmp|jpeg|gif|psd|png|jpg'
        #if file_ext in img_ext:
        #    print('ok---'+file_ext)
    elif os.path.isdir(path):
        for x in os.listdir(path):
            change_name(os.path.join(path,x)) #os.path.join()在路径处理上很有用

img_dir = 'D:\\xx\\xx\\images'
img_dir = img_dir.replace('\\','/')
start = time.time()
i = 0
change_name(img_dir)
c = time.time() - start
print('程序运行耗时:%0.2f'%(c))
print('总共处理了 %s 张图片'%(i))

输出结果:

程序运行耗时:0.11
总共处理了 109 张图片

读写json、csv文件

#csv读
import pandas as pd                         #导入pandas包
data = pd.read_csv("paper_author.csv")      #读取csv文件
print(data)                                #打印所有文件
print (data.head(5))                       #打印前5行

print(data.columns) 						#返回全部列名
print(data.shape)							#f返回csv文件形状
print(data.loc[1:2])						#打印第1到2行
data.loc[2:4, ['PassengerId', 'Sex']]       #打印行中特定列

#CSV写
import csv                     #需要导入csv文件
csvFile = open("csvData.csv", "wb")            #创建csv文件
writer = csv.writer(csvFile)                  #创建写的对象
#先写入columns_name                             
writer.writerow(["index","a_name","b_name"])     #写入列的名称
#写入多行用writerows                                #写入多行
writer.writerows([[1,a,b],[2,c,d],[3,d,e]])
csvFile.close()


例如
import csv
# 需要输出的数据组
a=[['8_1', [0.0, 4.2]],
   ['6_2', [0.0, 4.4]],
   ['7_3', [0.0, 3.85]],
   ['9_4', [4.2, 8.7]],
   ['1_5', [4.4, 8.98]]
   ]
 
#需要成立的表头
head = ['工人工号', '所在工位', '效率', '用时', '生产线平衡率']
 
#与表头对应的数据
row = [{'工人工号':a[i][0][0],'所在工位': a[i][0][-1], '效率':0.3, '用时':a[i][1][-1] - a[i][1][0],
        '生产线平衡率':'{:.2%}'.format(0.933)} for i in range(len(a))]
#写入内容   
with open('D:/file.csv', 'w', newline= '') as w :
    w_csv = csv.DictWriter(w,head)  #方法改变
    w_csv.writeheader()  #方法改变
    w_csv.writerows(row)

JSON有三种格式,每一种写法都和JS中的数据类型很像,可以很轻松的和JS中的数据类型互相转换
1.简单值的形式:JSON的简单值的格式对应着JS中的基础数据类型:数字 字符串 布尔值
2.对象形式:对应着JS中的对象
3.数组形式
JSON.parse():可以将JSON格式的字符串解析成JS中对应的值, 一定要是合法的字符串否则会报错
JSON.stringify():可以将JS中的数据类型、对象或数组转换成JSON格式的字符串

#json写

import json

names = ['joker','joe','nacy','timi']
filename='names.json'
with open(filename,'w') as file_obj:
     json.dump(names,file_obj)

#json读
import json

filename='names.json'
with open(filename) as file_obj:
     names = json.load(file_obj)

print(names)









 读写XML

 HTML与XML的区别
1. HTML是用来显示数据的,其焦点是数据的外观;XML是用来描述数据、存放数据的,所以可以作为持久化的介质,其焦点是数据的内容 。
2. HTML将数据和显示结合在一起,在页面中把这数据显示出来;而XML则将数据和显示分开。

XML是可扩展标记语言(Extensible Markup Language)的缩写,其中标记是关键部分。用户可以创建内容,然后使用限定标记标记它,从而使每个单词、短语或块成为可识别、可分类的信息。
HTML是超文本标记语言。XML可以说是HTML的补充,可以自己定义。

对xml文件进行解析
from lxml import etree 

etree.HTML()可以用来解析字符串格式的HTML文档对象,将传进去的字符串转变成_Element对象。作为_Element对象,可以方便的使用getparent()、remove()、xpath()等方法。

例如:html_tree = etree.HTML(html_str)

读写excel

xls读
import xlrd
data = xlrd.open_workbook('test.xls') # 打开xls文件
table = data.sheets()[0] # 打开第一张表
for i in range(table.nrows): # 获取表的行数 循环逐行打印
	if i == 0: # 跳过第一行
		continue
	print(table.row_values(i)[:13])  #取前十三列

xls写
import xlwt
book = xlwt.Workbook(encoding='utf-8')
sheet = book.add_sheet('sheet_test', cell_overwrite_ok=True)

sheet.write(0, 0, 'Python')
sheet.row(0).write(1, 'is')
sheet.write(0, 2, 'very very useful.')
sheet.col(2).width = 4000

book.save('test.xls')

 异常处理


异常的原因一方面可能是写程序时由于疏忽或者考虑不全造成了错误,这时就需要根据异常Traceback到出错点,进行分析改正;另一方面,有些异常是不可避免的,但我们可以对异常进行捕获处理,防止程序终止。

当发生异常时,我们就需要对异常进行捕获,然后进行相应的处理。python的异常捕获常用try...except...结构,把可能发生错误的语句放在try模块里,用except来处理异常,每一个try,都必须至少对应一个except。此外,与python异常相关的关键字主要有:

关键字	      关键字说明
try/except	捕获异常并处理
pass	    忽略异常
as	        定义异常实例(except MyError as e)
else	    如果try中的语句没有引发异常,则执行else中的语句
finally	    无论是否出现异常,都执行的代码
raise    	抛出/引发异常

例如捕获多个异常
try:
     <语句>
 
except (<异常名1>, <异常名2>, ...):
 
      print('异常说明')

或者按优先级排序
try:
     <语句>
except <异常名1>:
      print('异常说明1')
except <异常名2>:
      print('异常说明2')
except <异常名3>:
      print('异常说明3')


else 和 finally 

str1 = 'hello world'
try:
    int(str1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
else:
    print('try内没有异常')
finally:
    print('无论异常与否,都会执行我')

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值