Python(3):文件读写与异常
访问路径:
文件读写必然涉及到文件会放在某个路径下。在python里,可以通过引入os包来实现切换当前访问的路径:
# 假设我在 /home/zyq/KiDe/Python/test 文件夹中有一个文件 test.txt 那么我可以通过以下命 令定位到该文件夹:
>>>import os
>>>os.chdir('/home/zyq/KiDe/Python/test')
# 此时可以通过 os.getcwd() 来得到当前的工作目录。
# 此时可以通过如果下命令来进行文件读取测试:
>>>data = open('test.txt')
>>>print(data.readline(), end='')
This is line1
>>>print(data.readline(), end='')
This is line2
>>>data.seek(0) # 此时将游标又放到了文件最开始
>>> for each_line in data:
print(each_line, end='')
>>>data.close() # 一定要记得关闭读取流
DirRead
读写实例:
这里我们来处理另一个类似的文件。只不过这个文件可以看做是两个人对话的文件,文件内容如下:
Man: You didn't!
Other Man:I'm telling you, I did!
Man: You did not!
Other Man:Oh I'am sorry, is this a five minute argument,or the full of the half hour?
Man:Ah!(taking out his wallet and paying) Just the five minutes.
Other Man:Just the five minutes. Thank you.
Other Man:Anyway, I did.
Man:You most certainly did not!
Other Man:Now let's get one thing quite clear:I most definitely old you!
Pause
Man:Oh no you didn't!
Other Man: Oh yes I did!
End
Talk.txt
这个文件假设为test2.txt,假设我们需要处理每一行的数据,将每个人的对话区别开来,我们可以使用python内置的split函数, 针对每一行数据采用如下:
(role, line_spoken) = each_line.split(":")。假设我们以此采用该代码来处理每一行,会发现报了一个: ValueError:to many values to upack (expected 2) 。这是由于 Other Man:Now let's get one thing quite clear:I most definitely old you! 这一句出现了两个 ":" 。
我们可以通过 help(split)来查看split函数说明,看先是否有可以选择的参数来实现我们所需。
可以看到有一个 maxsplit参数来指定,对于间隔符的处理次数,我们这里只要得到两部分,即只要处理一次即可,所以可以修改每行读取函数为:
>>>for each_line in data:
>>> (role, line_spoke) = each_line.split(":", 1)
>>> print(role, end='')
>>> print(" says: ", end='')
>>> print(line_spoke, end='')
NewSplit
这样发现还是有问题,因为 Pause行 和 End行 根本没法进行分割,这时有两种解决方案:
# 方案一: 使用 each_line.find(":")来判断当前行中是否有分割符
>>>for each_line in data:
>>> if not each_line.find(":") == -1:
>>> print(role, end='')
>>> print(" says: ", end='')
>>> print(line_spoke, end='')
# 这个方案不强壮且可能需要经常变动。此时可以用到异常:
# 方案二: 使用try except来处理,对于异常处理如果使用pass的话表示忽略这个异常继续执行:
>>>for each_line in data:
>>> try:
>>> print(role, end='')
>>> print(" says: ", end='')
>>> print(line_spoke, end='')
>>> except:
>>> pass
Solutions
可以发现异常只需简单的处理就完成了想要的功能。接下来我们对异常进行具体化,假设要打开的文件不存在,在python中会抛出 IOError 。当然我们也可以通过 if os.path.exists(test3.txt) 来判断文件是否存在。
这里我们改进下异常处理代码,通过具化的异常捕获来实现:
try:
data = open('test3.txt')
for each_line in data:
(role, line_spoken) = each_line.split(":", 1)
print(role, end='')
print(" says: ", end='')
print(line_spoken, end='')
except ValueError:
pass # 表示忽略该异常,程序继续往下运行
except IOError:
print("File not exists!")
finally:
if 'data' in locals(): # 判断data变量是否存在当前区域内
print("Close file!")
data.close()
SpecificExcept
保存数据到文件:
去掉字符串两端的空格,python有一个 strip函数,使用方式和java的trim一样。
python将数据写入文件大概包括下面三步:
1. 利用open函数打开文件进行写,open默认的打开方式是 "r",表示文件是用来打开读的,要用来写可以使用 out = open("test2.txt", "w") 。
2. 利用print函数的file参数,该参数默认是输出到标准控制台(sys.stdout ,可以引入sys来使用该变量),其实也可以指定文件。使用方式如下:
print("Hello", file = out)。
3. 一定要记得关闭文件输入流。
PS: 打开文件进行写的时候,如果文件不存在会自动创建,使用w模式会清空文件中的所有内容。如果想在原来文件内容上追加,可以使用a模式(如果又想读使用a+)。要打开一个文件用来读和写需要清除原来内容的话,使用w+。
修改前面的分别提取两人的代码,将两个人的说话内容分别写入不同的文件,总的代码如下:
import os
os.chdir('/home/zyq/KiDe/Python/test')
man = []
otherMan = []
try:
data = open('test2.txt')
for each_line in data:
(role, line_spoken) = each_line.split(":", 1)
#print(role, end='')
# Store the message to array by the man
line_spoken = line_spoken.strip()
if role == 'Man':
man.append(line_spoken)
else:
otherMan.append(line_spoken)
#print(" says: ", end='')
#print(line_spoken, end='')
except ValueError:
pass
except IOError:
print("File not exists!")
finally: # 必定会执行的
if 'data' in locals(): # 判断data变量是否存在,即是否打开了文件流
print("Close file test2.txt!")
data.close() #write two arrays to file
try:
out1 = open("man.txt", "w")
out2 = open("otherMan.txt", "w") print(man, file = out1)
print(otherMan, file = out2) except IOError:
print("File write error!")
finally:
out1.close()
print("Close file man.txt!")
out2.close()
print("Close file otherMan.txt!")
Write
PS:在python中的字符串和java中一样也是不可变的。
上面这个程序还有以下改进点:
1. 具体的异常信息没有被输出, 这里可以对except块进行改进,改进后方式大致如下:
except IOError as err:
print("File error:" + str(err)) # 一定要是用str函数将异常转换为字符串,否则会抛出类型不兼容错误
2. 对于上面打开的文件,都需要在finally块中将其关闭,其实python实现了jdk1.7之后才有的由编译器自动关闭的方式,通过with方式可以简单的实现该功能:
with open('test.txt', "w") as data
另外with支持同时打开多个文件,只需要用逗号隔开即可:
with open('test.txt', "w") as data, open('test2.txt', "w") as data2
基于以上两点改进之后,新的代码如下:
import os
os.chdir('/home/zyq/KiDe/Python/test')
man = []
otherMan = []
try:
with open('test2.txt') as data: # with打开的不需要显示的关闭
for each_line in data:
(role, line_spoken) = each_line.split(":", 1)
# Store the message to array by the man
line_spoken = line_spoken.strip()
if role == 'Man':
man.append(line_spoken)
else:
otherMan.append(line_spoken)
except ValueError:
pass
except IOError as err:
print("File read error:" + str(err)) # 输出具体异常信息 #write two arrays to file
try:
with open("man.txt", "w") as out1, open("otherMan.txt", "w") as out2:
print(man, file = out1)
print(otherMan, file = out2)
except IOError as err:
print("File write error:" + str(err))
AutoClose
假设我现在想从文件中读出数据,直接使用readline可以发现文件中的所有内容都会被一股脑的输出出来,当然这时我们可以改进前面的print_list函数,使其增加一个输出到的位置参数 。使当时写入文件的列表数据按行来拆分。但是这样会导致函数的参数越来越多,使用更加复杂。所以这里我们使用另外一种方式: 引入pickle(腌制)包,并使用dump来写入数据,load来读出数据。此时需要注意写入和读出数据的时候模式应该用 "wb" 和 "rb",表示使用二进制的方式。使用pickle的时候可能抛出异常为PickleError,最终我们将代码改为:
import os
import pickle
os.chdir('/home/zyq/KiDe/Python/test')
man = []
otherMan = []
try:
with open('test2.txt') as data:
for each_line in data:
(role, line_spoken) = each_line.split(":", 1)
# Store the message to array by the man
line_spoken = line_spoken.strip()
if role == 'Man':
man.append(line_spoken)
else:
otherMan.append(line_spoken)
except ValueError:
pass
except IOError as err:
print("File read error:" + str(err)) #write two arrays to file
try:
with open("man.txt", "wb") as out1, open("otherMan.txt", "wb") as out2:
pickle.dump(man, file = out1)
pickle.dump(otherMan, file = out2)
except IOError as err:
print("File write error:" + str(err)) # 此时如果想读取man.txt文件中的信息的话,只需使用:
import pickle
with open('man.txt', 'rb') as data:
list = pickle.load(data)
# 此时list就是原来的列表。可以直接通过list[0]、list[1] 等来访问列表中的对应项。
Pickle
Python(3):文件读写与异常的更多相关文章
- 【转】Python之文件读写
[转]Python之文件读写 本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 ...
- (转)Python之文件读写
Python之文件读写 原文:https://www.cnblogs.com/huilixieqi/p/6494891.html 本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 ...
- 【Python】文件读写操作
Python的文件读写有点类似php的文件读写.php的文件读写已经在<[php]让记事本成为你调控变量的控制台>(点击打开链接)说过了,以下用一个小样例说明Python的文件读写. 在F ...
- python 基础-文件读写'r' 和 'rb'区别
原文链接: python基础-文件读写'r' 和 'rb'区别 一.Python文件读写的几种模式: r,rb,w,wb 那么在读写文件时,有无b标识的的主要区别在哪里呢? 1.文件使用方式标识 'r ...
- Python自动化--语言基础4--模块、文件读写、异常
模块1.什么是模块?可以理解为一个py文件其实就是一个模块.比如xiami.py就是一个模块,想引入使用就在代码里写import xiami即可2.模块首先从当前目录查询,如果没有再按path顺序逐一 ...
- python自动化--语言基础四模块、文件读写、异常
模块1.什么是模块?可以理解为一个py文件其实就是一个模块.比如xiami.py就是一个模块,想引入使用就在代码里写import xiami即可2.模块首先从当前目录查询,如果没有再按path顺序逐一 ...
- Python之文件读写
本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input ...
- python之文件读写详解
打开文件 函数open() 参数说明: file:文件路径 mode: 文件的读写方式,默认'r',只读方式: buffering:设置缓冲策略,0用于二进制文件,1为行缓冲,用于文本模式:默认二进制 ...
- Python的文件读写与存储
文件读写与存储 7.2. 读写文件 open()返回一个文件对象,最常见的用法带有两个参数:open(filename, mode). >>> f = open('workfile' ...
随机推荐
- 对Integer类中的私有IntegerCache缓存类的一点记录
对Integer类中的私有IntegerCache缓存类的一点记录 // Integer类有内部缓存,存贮着-128 到 127. // 所以,每个使用这些数字的变量都指向同一个缓存数据 // 因此可 ...
- .net core 自制错误日志
前言 之前.net framework用的ErrorLog帮助类,对于监控错误形成日志,内容非常清晰,想在.net core2.2中继续用,但是有很多不一样的地方,所以想总结一下. 首先需要HttpC ...
- iOS出现 _OBJC_CLASS_$_ZSHomeServiceDataElementGroupLargeImage", referenced from:以及linker command failed with exit code 1 (use -v to see invocation)的错误分析
先说第一个问题 出现这样的错误我总结的原因有两个,我碰到过的: 1.文件重命名,在你创建文件的时候重名了 2.如果你是在一个类中又创建了一个或者多个类,那么你可能没有实现你写的类,也就是你只是@int ...
- SpringMVC中重定向传参数的方法
在spring的一个controller中要把参数传到页面,只要配置视图解析器,把参数添加到Model中,在页面用el表达式就可以取到.但是,这样使用的是forward方式,浏览器的地址栏是不变的,如 ...
- 总结day25 ---- udp 初识, 和tcp 进阶
前情提要 一: tcp 和udp 的区别 # tcp # # 面向连接的 可靠的 全双工的 流式传输 # # 面向连接 :同一时刻只能和一个客户端通信 # # 三次握手.四次挥手 # # 可靠的 :数 ...
- PDF转HTML的方法。
上个项目客户提出了一个需求,要求把PDF格式的文件转化为HTML格式. 上网查了一下,要么使用软件处理,要么是HTML格式转化为PDF.因为涉及到图文识别问题,所以说仅仅依靠前端不能实现.在网上查了几 ...
- STM32-RS232通信软硬件实现
OS:Windows 64 Development kit:MDK5.14 IDE:UV4 MCU:STM32F103C8T6/VET6 AD:Altium Designer 18.0.12 1.RS ...
- Maven自动FTP远程部署
参照官网文档: https://maven.apache.org/plugins/maven-deploy-plugin/examples/deploy-ftp.html 1.在pom.xml中加入: ...
- PTA 这是二叉搜索树吗?
https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192 #include<iostream&g ...
- hiho# 1394最小路径覆盖 网络流拆点
题目传送门 思路: 观察到路径上除了终点起点以外的每个点出度和入度都为1,和网络流的拆点很像,所以就把每个点都拆成两个点,若存在一条路径$(u,v)$,则建一条$(u,v+n,1)$的边,然后求出最大 ...