Python如何从文件中读取数据
Python中的基本输入机制是基于行的:从文本文件向程序读入数据时,一次会到达一个数据行。
上图中,从标准库导入”os”
os.getcwd()的作用是查看当前工作目录
os.chdir()的作用是用于改变当前工作目录,其参数为Path 目标目录,可以是绝对目录或相对目录。
Python的open()BIF是用来与文件交互的,使用open()BIF处理文件中的数据时,会创建一个迭代器从文件向你的代码输入数据项,一次传入一行数据。
data=open(‘sketch.txt’) ——打开一个文件,并赋值给文件对象data
data.readline() ——使用readline()方法从文件获取一个数据行,这一点与java一样。
而end=’ ‘意思是末尾不换行,加空格。这个是python3的功能,python2会报错。
seek() 方法用于移动文件读取指针到指定位置。0表示文件开头。
close() 方法用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作, 否则会触发 ValueError 错误。 close() 方法允许调用多次。当 file 对象,被引用到操作另外一个文件时,Python 会自动关闭之前的 file 对象。 使用 close() 方法关闭文件是一个好的习惯。
异常处理
我们可以发现大部分数据行都是类似Man: Is this the right room for an argument?这样的的形式,这里我们可以对它们进行切割处理。
split()方法返回一个字符串列表,这回赋至一个目标标识符列表。这称为多重赋值。
在切割的过程中,我们发现有些数据行中不止一个:,这个问题我们可以利用each_line.split(‘:’,1)解决。
split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串。
我们还发现有些数据行不包含冒号,split()方法查找冒号时就会出现问题。我们可以增加额外逻辑,即事先对数据行进行判断。
find()会在一个字符串中查找一个指定子串。
data=open('sketch.txt')
for each_line in data:
if not each_find(':')==-1:
(role,line_spoken)=each_line.split(':',1)
print(role,end='')
print(' said:',end='')
print(line_spoken,end='')
data.close()
然而这意味着更大的复杂性,所以我们更推荐另一种方法,异常处理
处理异常
try/except机制,这和java的try/catch机制十分相似,提供了异常处理进制,从而保护可能导致运行时错误的某些代码行。
data=open('sketch.txt')
for each_line in data:
try:
(role,line_spoken)=each_line.split(':',1)
print(role,end='')
print(' said:',end='')
print(line_spoken,end='')
except:
pass
data.close()
如果你的异常处理代码设计为处理一种特定类型的错误,一定要在except代码行上制定错误类型,这样一来,就可以把一般化的异常处理代码转变为具有特定性。
try:
data=open('sketch.txt')
for each_line in data:
try:
(role,line_spoken)=each_line.split(':',1)
print(role,end='')
print(' said:',end='')
print(line_spoken,end='')
except ValueError:
pass
data.close()
except IOError:
print("The data file is missing!")
这一点和java的catch(IOException e)十分相似