python学习之文件(笔记)

编程入门 行业动态 更新时间:2024-10-07 02:30:59

python学习之<a href=https://www.elefans.com/category/jswz/34/1771438.html style=文件(笔记)"/>

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 = 0for 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 += 1return 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

更多推荐

python学习之文件(笔记)

本文发布于:2024-02-28 02:41:29,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1767447.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:文件   笔记   python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!