在Python世界中,文件也是一种数据类型。文件这个变量指向的是本地的文件
文件的声明由全局函数open(file_name [, access_mode][, buffering])完成,该函数有三个参数:
file_name:文件路径+文件名
access_mode:操作模式
buffering:编码方式
文件路径:
绝对路径的方式: ‘c:\\path\\data.txt‘ 或 r‘c:\path\data.txt‘
相对路径的方式: ‘data.txt‘ 系统会在当前的系统环境变量中的路径下去找,所以要用相对路径的方式,就得确保文件是放在这个路径下的,不然就找不到了
一般情况下还是用绝对路径吧。更清晰,不容易出错。
操作模式:
针对两大类文件:文本文件(unicode字符串),二进制文件(字节)
文本文件:
‘r‘ : 表示以只读的方式操作当前的文件
‘w‘ : 表示以写入的方式操作当前的文件
‘rw‘ : 表示以读和写的方式操作当前的文件,会覆盖之前的内容
‘a‘ : 打开文本,在文本中追加一些内容。
二进制:
‘rb‘ : 表示以读的方式操作当前的文件
‘wb‘ : 表示以写入的方式操作当前的文件
‘rwb‘ : 表示以读和写的方式操作当前的文件
‘ab‘ : 打开文本,在文本中追加一些内容
基本文件读写操作
1 >>> #先在桌面创建一个文件my_python.txt文件,编辑内容:我爱python 2 >>> #C:\Users\dddd\Desktop\mypython.txt 3 >>> #创建该文件的文件对象 4 >>> f = open(r‘C:\Users\dddd\Desktop\mypython.txt‘,‘r‘,encoding=‘UTF-8‘) 5 6 >>> #看看文件对象的类型 7 >>> type(f) 8 <class ‘_io.TextIOWrapper‘> 9 10 >>> # 一次性读出文件中的所有内容 11 >>> f.read() 12 ‘\ufeff我爱python‘ 13 >>> 14 >>> type(f.read()) 15 <class ‘str‘> 16 >>> # 可见f.read()读取的文件内容是转化成字符串的 17 >>> 18 >>> f.read() 19 ‘‘ 20 >>> #什么情况,为什么再次来读文件内容返回空字符串? 21 >>> #文件内部有一个指针,read()从头开始读,一直读到最后结束,指针就在文件末尾的位置。所以再调用read()方法,发现已经没有什么可读了。 22 >>> #有两种方法可以重新读取出文件内容 23 >>> #方法 1 再创建一个该文件的文件对象,用新的文件对象读取文件中的内容 24 25 >>> #方法 2 把指针重新移到文件的开头,调用seek(),将指针移到第一个字符的位置 26 >>> #把指针移动到文件开头 27 >>> f.seek(0) 28 0 29 >>> #seek()会返回移动指针后指针的位置 30 >>> f.read() 31 ‘\ufeff我爱python‘ 32 >>> #看到了吧,把文件的指针移动到文件开头,又可以读取文件内容了 33 >>> 34 >>> #强烈建议大家,文件对象用完之后,明确地关闭文件链接 35 >>> f.close()
深入学习文件读操作
1 >>> f = open(r‘C:\Users\dddd\Desktop\mypython.txt‘,‘r‘,encoding=‘UTF-8‘) 2 >>> f.read() 3 ‘\ufeff我爱python\n全会由中央纪律检查委员会常务委员会主持。\n全会以新时代中国特色社会主义思想为指导,\n全面贯彻落实党的十九大精神,\n研究部署2018年纪检监察工作,\n审议通过了赵乐际同志代表中央纪委常委会所作\n的《以新时代中国特色社会主义思想为指导\u3000坚定不移落实党的十九大全面从严治党战略部署》工作报告。‘ 4 >>> #read()方法是直接把文件中的所有内容作为一个字符串返回的,当文件内容较少时无所谓,但是文件内容比较多,处理速度可能就会很慢 5 >>> 6 >>> # 另外一个读取方法,readlines(),读取文件所有的行,默认把整个文件以行为单位进行切割,返回切割后作为列表的元素返回列表 7 >>> f.seek(0) 8 0 9 >>> f.readlines() 10 [‘\ufeff我爱python\n‘, ‘全会由中央纪律检查委员会常务委员会主持。\n‘, ‘全会以新时代中国特色社会主义思想为指导,\n‘, ‘全面贯彻落实党的十九大精神,\n‘, ‘研究部署2018年纪检监察工作,\n‘, ‘审议通过了赵乐际同志代表中央纪委常委会所作\n‘, ‘的《以新时代中国特色社会主义思想为指导\u3000坚定不移落实党的十九大全面从严治党战略部署》工作报告。‘] 11 >>> #可以把f.readlines()返回的列表指定一个列表名 12 >>> f.seek(0) 13 0 14 >>> l = f.readlines() 15 >>> #接下来对列表l进行操作就行了,跟没文件对象什么事了 16 >>> #readlines()还是存在一次性返回文件所有内容的情况,若文件较大,会影响运行速度 17 >>> 18 >>> #readline()函数是逐行读取文件内容 ,非常适合读取大文件,节省内存,调用一次就会读取文件的一行并以字符串的形式返回 19 >>> 20 >>> f.seek(0) 21 0 22 >>> f.readline() 23 ‘\ufeff我爱python\n‘ 24 >>> f.readline() 25 ‘全会由中央纪律检查委员会常务委员会主持。\n‘ 26 >>> 27 >>> #当然还是有很多应用场景需要把文件用readlines()按行拆分列表,然后会列表中的每个元素进行处理 28 29 >>> 30 >>> #由于文件对象f是可迭代对象,可以直接遍历获取文件内容 31 >>> #这样就不用把文件读取到列表中,因为文件太大,比较消耗内存 32 >>> f.seek(0) 33 0 34 >>> for line in f: 35 print(line) 36 37 38 我爱python 39 40 全会由中央纪律检查委员会常务委员会主持。 41 42新时代中国特色社会主义思想为指导, 43 44 全面贯彻落实党的十九大精神, 45 46 研究部署2018年纪检监察工作, 47 48 审议通过了赵乐际同志代表中央纪委常委会所作 49 50 的《新时代中国特色社会主义思想为指导 坚定不移落实党的十九大全面从严治党战略部署》工作报告。 51 >>>
深入学习文件写操作
1 >>> import os 2 >>> #获取当前工作目录 3 >>> os.getcwd() 4 ‘C:\\Users\\dddd\\AppData\\Local\\Programs\\Python\\Python35‘ 5 >>> #如果我文件没有放在这个目录下,想要创建一个文件对象就必须用绝对路径 6 >>> #有时候为了少写一些路径,可以直接把工作目录切换到文件所在的路径 7 >>> 8 >>> #将工作目录切换到桌面 9 >>> #桌面的路径:C:\Users\dddd\Desktop\ 10 >>> os.chdir(r‘C:\Users\dddd\Desktop\‘) 11 12 SyntaxError: EOL while scanning string literal 13 >>> os.chdir(r‘C:\Users\dddd\Desktop‘) 14 >>> f = open(‘mypython.txt‘,‘w‘,encoding=‘utf-8‘) 15 >>> 16 >>> # 写入方法 1 write() 一次只写入一行,w模式会覆盖之前文件中的内容 17 >>> f.write(‘I love python‘) 18 13 19 >>> #write()函数会返回本次向文件中写入了多少个字节 20 >>> 21 >>> f.close() 22 >>> #关闭文件链接,将缓存中的内容写入到硬盘上 23 >>> 24 >>> #写入方法 2 write() 一次性写入多行,实现准备一个list,每一行要写入文件的内容作为list的一个元素 25 >>> l = [‘Mark‘,‘Tony‘,‘Marry‘,‘Mike‘,‘Jack‘] 26 >>> f = open(‘mypython.txt‘,‘w‘,encoding=‘utf-8‘) 27 >>> f.writelines(l) 28 >>> #到这里,写入操作已经完成,但实际上只是写入到缓存,除了关闭链接将缓存中的内容刷新到硬盘中,还可以用flush()函数,在不关闭文件链接的情况下将缓存中的内容刷新到硬盘中 29 >>> f.flush() 30 >>> f.close() 31 >>> 32 >>> #折腾了半天,看看现在文件中的内容是什么 33 >>> f = open(‘mypython.txt‘,‘r‘,encoding=‘utf-8‘) 34 >>> f.read() 35 ‘MarkTonyMarryMikeJack‘ 36 >>> #咦???我实现多行显示这几个名字的,怎么都显示在一行上了? 37 >>> f.close() 38 >>> 39 >>> #看来是用writelines()函数时,需要手工为没一行内容后加上换行符 \n 40 >>> 41 >>> l 42 [‘Mark‘, ‘Tony‘, ‘Marry‘, ‘Mike‘, ‘Jack‘] 43 >>> ll = [a + ‘\n‘ for a in l] 44 >>> f = open(‘mypython.txt‘,‘w‘,encoding=‘utf-8‘) 45 >>> l 46 [‘Mark‘, ‘Tony‘, ‘Marry‘, ‘Mike‘, ‘Jack‘] 47 >>> ll = [a + ‘\n‘ for a in l] 48 >>> f.writelines(ll) 49 >>> f.flush() 50 >>> f.close() 51 >>> 52 >>> #再看看文件的写入效果 53 >>> f = open(‘mypython.txt‘,‘r‘,encoding=‘utf-8‘) 54 >>> f.read() 55 ‘Mark\nTony\nMarry\nMike\nJack\n‘ 56 >>> 57 >>> 58 >>> # 写入方法 3 如果想在原文件的基础上追加一些内容,可用a模式 59 >>> f.close() 60 >>> f = open(‘mypython.txt‘,‘a‘,encoding=‘utf-8‘) 61 >>> f.writelines([‘John‘]) 62 >>> f.close() 63 >>>
上下文语法
1 >>> #为了避免忘写close(),可以用上下文的语法,通过一个特定的代码段,将一系列的操作封装在上下文环境中,当环境结束时,会自动调用close()函数 2 >>> with open(‘mypython.txt‘,‘a‘,encoding=‘utf-8‘) as f: 3 f.write(‘I Love 广东亿迅‘) 4 5 6 11 7 >>> 8 >>> #再来看看文件中的内容情况 9 >>> with open(‘mypython.txt‘,‘r‘,encoding=‘utf-8‘) as f: 10 f.read() 11 12 13 ‘Mark\nTony\nMarry\nMike\nJack\nJohnI Love 广东亿迅‘ 14 >>> 15 #这个上下文的语法很实用,比如数据库的操作连接,网络连接等,自动释放资源,很方便