python学习之文件(笔记)

文件的理解

文件是数据的抽象和集合
-文件是存储在辅助存储器上的数据序列
-文件是数据存储的一种形式
-文件展现形态:文本文件和二进制文件

文本文件vs.二进制文件
-文件文件和二进制文件只是文件的展示方式
-本质上,所有文件都是二进制形式存储
-形式上,所有文件采用两种方式展示
二者最根本的区别在于有无编码,所有的文件都可以以二进制的形式打开

文本文件:
-由单一特定编码组成的文件,如UTF-8编码
-由于存在编码,也被看成是存储着的长字符串
-适用于例如:.txt文件、.py文件

二进制文件:
-直接由比特0和1组成,没有统一字符编码
-一般存在二进制0和1的组织结构,即文件格式
-适用于例如:.png文件、avi文件等
实例:
文本文件打开

tf = open("f.txt","rt",encoding='UTF-8')
print(tf.readline())
tf.close()

Output:
你好啊

二进制文件打开

tf = open("f.txt","rb")
print(tf.readline())
tf.close()

Output:
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a'

文件的打开和关闭

文件的处理步骤:打开-操作-关闭
在这里插入图片描述
操作包括:
读文件
a.read(size)
a.readline(size)
a.readlines(hint)
写文件
a.write(s)
a.writelines(lines)
a.seek(offset)

文件的打开

在这里插入图片描述

文件路径:四种可使用的路径

1、绝对路径: “D:/PYE/f.txt”,因为在Windows下,反斜杠\表示路径在这里插入图片描述
而在python中\是转义符,故用斜杠/来代替反斜杠\,或者用\来表示\,第二种即是如此
2、绝对路径:“D:\PYE\f.txt”,\表示
3、相对路径:"./PYE/f.txt"若程序和文件都在D盘,可用.来代替共同的路径
4、若程序和文件在同一目录下,直接输入文件名即可

打开模式:

在这里插入图片描述在这里插入图片描述

文件的关闭:

在这里插入图片描述
若没有此语句,文件会一直处于打开状态,而在程序关闭的时候,Python解释器会自动关闭文件

文件的读取:

1、a.read(size)
在这里插入图片描述

tf = open("f.txt","rt",encoding='UTF-8')
print(tf.read(2))
tf.close()

Output:
你好

2、a.readline(size)
读入一行内容,如果给出参数,读入该行前size长度
3、a.readlines(hint)
在这里插入图片描述

tf = open("f.txt","rt",encoding='UTF-8')
print(tf.readlines())
tf.close()

Output:
['你好啊']

文件的全文本操作

遍历全文本方法一:
一次读入,统一处理
弊端:对于大文件而言,浪费时间和内存

fname = input("Please input the file name:")
fo = open(fname,"r",encoding='UTF-8')
txt = fo.read()#将全文保存为一个字符串txt,进而对txt进行操作
print(txt)
fo.close()

Output:
Please input the file name:f.txt
你好啊

遍历全文本方法二:按数量读入分批处理

fname = input("Please input the file name:")
fo = open(fname,"r",encoding='UTF-8')
txt = fo.read(2)#每次读入长度为2的内容
while txt !="":
    print(txt)
    txt = fo.read(2)
fo.close()

Output:
Please input the file name:f.txt
你好
啊

文件的逐行操作

逐行遍历文件方法一:一次读入,分行处理

fname = input("Please input the file name:")
fo = open(fname,"r",encoding='UTF-8')
for line in fo.readlines():#每行是列表的一个元素,用line遍历列表
    print(line)
fo.close()

Output:
Please input the file name:f.txt
你好啊

逐行遍历文件方法二:分行读入,逐行处理

fname = input("Please input the file name:")
fo = open(fname,"r",encoding='UTF-8')
for line in fo:#直接遍历句柄
    print(line)
fo.close()

Output:
Please input the file name:f.txt
你好啊

数据的文件写入

1、a.write(s)
其参数s是一个字符串
在这里插入图片描述
2、a.writelines(lines)
其参数是一个列表,直接将列表中的元素拼接后写入文件
在这里插入图片描述
2、辅助函数a.seek(offset)
改变指针位置
在这里插入图片描述
实例:

fo = open("Output.txt","w+")
ls =["China","France","America"]
fo.writelines(ls)
for line in fo:
    print(line)
fo.close()

Output:

修改代码,增加fo.seek(0)

fo = open("Output.txt","w+")
ls =["China","France","America"]
fo.writelines(ls)
fo.seek(0)
for line in fo:
    print(line)
fo.close()

Output:
ChinaFranceAmerica

二者不同之处在于:前者在经过fo.writelines(ls)之后,此时的指针在文件的末尾,打印时为空白,而后者添加了fo.seek(0),将指针回到文件的最开头,故此时打印的是整个文件

机器学习实例

1、读取txt文件,解析tab分隔的数据行
在这里插入图片描述
文件中每一行是一个实例,前三列为特征,最后一列为标签,我们的目标是将每一行的数据放入一个列表,再由这些列表形成一个总列表。

def txtTrans():
    fo = open(r'C:\Users\yl187\Desktop\test.txt', 'r', encoding='UTF-8')
    lenses = [inst.strip().split('\t') for inst in fo.readlines()]
    print(lenses)
    fo.close()
if __name__ == '__main__':
    txtTrans()

Output:
[['young', 'myope', 'no', 'reduced', 'no lenses'], ['young', 'myope', 'no', 'normal', 'soft'], ['young', 'myope', 'yes', 'reduced', 'no lenses'], ['young', 'myope', 'yes', 'normal', 'hard'], ['young', 'hyper', 'no', 'reduced', 'no lenses'], ['young', 'hyper', 'no', 'normal', 'soft'], ['young', 'hyper', 'yes', 'reduced', 'no lenses'], ['young', 'hyper', 'yes', 'normal', 'hard'], ['pre', 'myope', 'no', 'reduced', 'no lenses'], ['pre', 'myope', 'no', 'normal', 'soft'], ['pre', 'myope', 'yes', 'reduced', 'no lenses'], ['pre', 'myope', 'yes', 'normal', 'hard'], ['pre', 'hyper', 'no', 'reduced', 'no lenses'], ['pre', 'hyper', 'no', 'normal', 'soft'], ['pre', 'hyper', 'yes', 'reduced', 'no lenses'], ['pre', 'hyper', 'yes', 'normal', 'no lenses'], ['presbyopic', 'myope', 'no', 'reduced', 'no lenses'], ['presbyopic', 'myope', 'no', 'normal', 'no lenses'], ['presbyopic', 'myope', 'yes', 'reduced', 'no lenses'], ['presbyopic', 'myope', 'yes', 'normal', 'hard'], ['presbyopic', 'hyper', 'no', 'reduced', 'no lenses'], ['presbyopic', 'hyper', 'no', 'normal', 'soft'], ['presbyopic', 'hyper', 'yes', 'reduced', 'no lenses'], ['presbyopic', 'hyper', 'yes', 'normal', 'no lenses']]

  • for inst in fo.readlines() 用inst逐行遍历文件
  • strip()移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。返回新字符串
  • split()通过指定分隔符对字符串进行切片,返回分割后的字符串列表。

2、读取txt文件内容,存入特征矩阵与标签向量中

描述:多条实例存在txt文件中,每条实例有三个特征(每年获得的飞行常客里程数,玩视频游戏所耗时间百分比,每周消费的冰淇淋公升数),一个标签(对这个人的喜欢程度,分为1、2、3共三个等级),现在需要将特征存入到特征矩阵中(文件行数X特征数3),标签存入到标签向量中,以便后续使用。

  • 文件形式:
    在这里插入图片描述
def file2matrix(filename):
    fr = open(filename)                         #fr为句柄
    numberOfLines = len(fr.readlines())         #得到文件行数
    returnMat = zeros((numberOfLines,3))        #准备一个空矩阵,另一维度置3(特征数)
    classLabelVector = []                       #准备空列表存放标签
    fr = open(filename)
    index = 0
    for line in fr.readlines():#用line遍历由每行元素组成的列表
        line = line.strip()#截掉回车符
        listFromLine = line.split('\t')#按\t对字符串切片,返回分割后的字符串列表
        returnMat[index,:] = listFromLine[0:3]#选取前3个元素放入特征矩阵
        classLabelVector.append(int(listFromLine[-1]))#将列表最后一列以整型存入向量中
        index += 1
    return returnMat,classLabelVector
  • fr.readlines()为读入文件所有行,以每行为元素形成列表;如果给出参数,读入前hint行
  • line.strip()为截掉头尾的回车符\n
  • line.split(’\t’)为通过分隔符\t对字符串进行切片,返回分割后的字符串列表。
if __name__ == '__main__':
    datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
    print(datingDataMat)
    print(datingLabels[0:20])

Output:
[[4.0920000e+04 8.3269760e+00 9.5395200e-01]
 [1.4488000e+04 7.1534690e+00 1.6739040e+00]
 [2.6052000e+04 1.4418710e+00 8.0512400e-01]
 ...
 [2.6575000e+04 1.0650102e+01 8.6662700e-01]
 [4.8111000e+04 9.1345280e+00 7.2804500e-01]
 [4.3757000e+04 7.8826010e+00 1.3324460e+00]]
[3, 2, 1, 1, 1, 1, 3, 3, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3]

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值