文章目录

  • 一、file文件操作
  • (一)文本文件和二进制文件
  • (二)文件操作相关模块概述
  • (三)创建文件对象open()
  • (四)文本文件的写入
  • 1.基本的文件写入操作
  • 2.中文乱码问题
  • (五)关闭流要点
  • 1.try异常管理
  • 2.with语句(上下文管理器)
  • (六)文本文件的读取
  • (七)enumerate()函数和推导式生成列表
  • (八)(二进制文件)图片文件的拷贝
  • (九)文件对象常用方法和属性的总结
  • (十)使用pickle实现序列化和反序列化
  • (十一)csv文件的读取和写入
  • 二、os模块
  • 三、shutil模块(拷贝和压缩)


一、file文件操作

(一)文本文件和二进制文件

  • 文本文件:存储的是“字符”文本,python默认为unicode字符集。
  • 二进制文件:将数据内容用“字节”进行存储,无法用记事本打开。

(二)文件操作相关模块概述

file文件怎么保存 python python的file在哪_file文件怎么保存 python


file文件怎么保存 python python的file在哪_python_02

(三)创建文件对象open()

  • 基本语法格式:open(文件名[,打开方式])
  • 打开方式有下图几种:
  • 注:文件名可以输入全路径,比如:D:\a\b.txt;也可以使用原始字符串:r"d:\b.txt"
  • 例子:open(r"d:\a.txt",“a”)

(四)文本文件的写入

1.基本的文件写入操作

  • 创建文件对象
  • 写入数据
  • 关闭文件对象
f=open(r"a.txt","a")
s="hello"
f.write(s)
f.close()

2.中文乱码问题

当用以下程序向文件中写入中文时,文件会出现乱码

f=open(r"a.txt","a")
s="你好"
f.write(s)
f.close()

file文件怎么保存 python python的file在哪_文本文件_03


Linux操作系统默认的编码是utf-8,utf-8可以看做是unicode的实现。

windows操作系统默认的编码是GBK

python默认的编码是unicode

由于编码和解码需要是同一种编码方法,所以在python中打开文件f=open,输入中文f.write并关闭文件f.close,然后查看建成的txt文件时,需要右键->file Encoding->GBK,才能将乱码转为中文。

(五)关闭流要点

1.try异常管理

用try…finally语句确保文件无论在何种情况下,都能关闭

try:
	f=open(r"b:\a.txt","a")
	str="hello"     #或str=["aaa\n","bbb\n","ccc\n"]
	f.write(str)    #或f.writeline(str) 用于写入字符串列表
except BaseError as e:
	print(e)
finally:
	f.close()

2.with语句(上下文管理器)

with执行完语句块后,会自动还原操作环境,因此能够确保文件的正确关闭。

s=['gao','kk']
with open(r"d:\a.txt","a") as f:
	f.writeline(s)

(六)文本文件的读取

  • read([size]):从文件中读取size个字符,并作为字符返回。若不指定size,则会读取整个文件。
  • readline():读取一行内容作为结果返回。
  • readlines():每一行作为一个字符串存入列表中,并返回该列表。
#读取文本内容
with open(r"a.txt","r",encoding="GBk") as f:
	str=f.read()
	print(str)

#按行读取一个文件
with open(r"a.txt","r",encoding="utf-8") as f:
	while True:
		fragment=f.readline()
		if not fragment:    #读取行内容为空
			break
		else:
			print(fragment,end='')  #不写end=‘’,那么执行print后,就会自动空一行

#按行读取一个文件(使用迭代器)
with open(r"a.txt","r") as f:
	for a in f:
		print(a,end='')

(七)enumerate()函数和推导式生成列表

将文件中的每一行加上行号,例如将[“i love you”,“爱你”],变成[“i love you #0”,“爱你 #1”]

>>>a=["i love you","爱你"]
>>>b=enumerate(a)   
>>>print(list(b))
[(0,"i love you"),(1,"爱你")]
>>>c=[temp+"#"+str(index) for index,temp in enumerate(a)]
>>>c
["i love you #0","爱你 #1"]

with open(r"a.txt","r",encoding="utf-8") as f:
	lines=f.readlines()    #把文件中每一行的信息读取到lines中,并返回一个列表
	c=[temp.rstrip()+"  #"+str(index) for index,temp in enumerate(lines)]   #把列表lines中的每一行信息加上行号,再组成一个列表
with open("e.txt","w",encoding="utf-8") as f:
	f.writelines(c)

(八)(二进制文件)图片文件的拷贝

with open("aa.gif","rb") as f:           #打开aa图片
	with open("aacopy.gif","wb") as w:   #新建图片
		for line in f.readline():        #读取aa中的内容
			w.write(line)                #将每一行的内容写入到新建的文件中

(九)文件对象常用方法和属性的总结

file文件怎么保存 python python的file在哪_反序列化_04


file文件怎么保存 python python的file在哪_python_05

with open("a.txt","r",encoding="utf-8") as f:
	print("文件的名字是:{0}".format(f.name))
	print(f.tell())  #返回当前指针在文件中的位置
	print("文件的内容是:{0}".format(str(f.readline()))   #读取一行内容 
	f.tell()
	f.seek(5,1)   #从当前位置向后偏移5个位移量
	print("文件的内容是:{0}".format(str(f.readline()))

(十)使用pickle实现序列化和反序列化

通过实现对象的序列化和反序列化,可以将内存块的数据保存到硬盘上,或通过网络传输给其他计算机。
序列化:将对象转化成为“串行化”数据形式;
反序列化:将“串行化”数据形式转化成为对象。
(把信息变成一串,需要的话,就像流水一样转到其他地方,再将一串数据复原)

pickle.dump(obj,file)
pickle.load(file)
#将信息序列化
import pickle
with open(r"d:/data.dat","wb") as f:   #拓展名(这里是.dat)可以随便起,没有也可以。不过这里一定是wb,表示写入二进制文件
	a1='hello'          #假设有很多信息
	a2=20
	a3=[20,50]

	pickle.dump(a1,f)   #将信息分别存入文件中
	pickle.dump(a2,f)
	pickle.dump(a3,f)

#反序列化
with open(r"d:/data.dat","rb") as f:
	b1=pickle.load(a1,f)    #按照存入的顺序,再分别取出
	b2=pickle.load(a2,f)
	b3=pickle.load(a3,f)

	print(b1);print(b2):print(b3)  #这里a1和b1是两个不同的对象

(十一)csv文件的读取和写入

csv文件是excel表格的简单版,里面的值没有类型,都是字符串。

import csv
#读取csv文件
with open("dd.csv","r") as f:
	a_csv=csv.reader(f)    
	for i in a_csv:
		print(list(i))

#写入csv文件
with open("ee.csv","w") as f:
	b_csv=csv.writer(f)
	b_csv.writerow(['ID','NAME'])
	b_csv.writerow(['10020','judy'])
	
	c=[['10021','edision'],['10023','mandy']]
	b_csv.writerows(c)

二、os模块

os模块可以帮助我们对操作系统进行操作,比如直接操作文件、目录等等。

  • os调用操作系统文件和命令
#使用os.system调用windows系统的记事本程序
import os
os.system("notepad.exe")

#使用os.system查看是否能够连接(ping)百度网页
import os
os.system("ping www.baidu.com")
  • os调用可执行的文件
os.startfile(r"C:\Program Files (x86)\Tencent\WeChat\WeChat.exe")

file文件怎么保存 python python的file在哪_python_06

file文件怎么保存 python python的file在哪_反序列化_07


注1:os.rename(“电影”,“movie”) 将电影重新命名为movie

注2:os.listdir(‘movie’) 列出movie下的所有一级子目录

file文件怎么保存 python python的file在哪_二进制文件_08


注3:rmdir和removedirs只能删除空目录

注4:os.makedirs("…/音乐/周杰伦") …/指的是在上一级目录中建立新的目录

file文件怎么保存 python python的file在哪_反序列化_09

import os
import os.path    #from os import path
#------判断:绝对路径、是否目录、是否文件、文件是否存在-----------
print(os.path.isabs('d:/a.txt'))   
print(os.path.isdirs('d:/a.txt'))
print(os.path.isfile('d:/a.txt'))
print(os.path.exists('d:/a.txt'))
#-------------获得文件基本信息-----------
print(os.path.getsize('d:/a.txt'))
print(os.path.abspath('d:/a.txt'))
print(os.path.dirname('d:/a.txt'))

print(os.path.getatime('d:/a.txt'))   #这里返回的是从1970年到现在的总毫秒数
print(os.path.getmtime('d:/a.txt'))
#-------------对文件路径做操作-----------
path=os.path.abspath('d:/a.txt')
print(os.path.split(path))    #以文件名为分界点对路径进行切割,然后放在元组内返回
print(os.path.splitext(path))    #以拓展名为分界点对路径进行切割,然后放在元组内返回
print(os.path.join('a','b','c'))  #a\b\c

练习

#列出指定目录下的所有.py文件,并输出文件名
import os
path = getcwd()
file_list = os.listdir(path)   #返回当前文件夹下所有的目录和文件
for file_name in file_list:
	if file_name.endwith('py'):
		print(file_name)

#--------------用列表推导式生成列表------------------
list_file=[file_name for file_name in file_list if file_name.endwith('py')]
for file_name in list_file:
		print(file_name,end='\t')   #打印列表
  • work()递归遍历所有文件和目录
    os.walk()返回一个3个元素的元组,(dirpath,dirnames,filenames)-> (指定目录的路径,路径下所有文件夹,路径下所有文件)
#coding=utf-8
list=[]
import os
path=os.getcwd()
list_files=os.walk(path)
for dirpath,dirnames,dirfiles in list_files:
	for dir in dirnames:
		list.append(os.path.join(dirpath,dir))
	for file in dirfiles:
		list.append(os.path.join(dirpath,file))

for f in list:
	print(f)

三、shutil模块(拷贝和压缩)

shutil模块主要用来做文件的拷贝、压缩和删除。

import shutil
#----------------拷贝---------------------
shutil.copyfile("1.txt","1.copy.txt")
shutil.copytree("movie/港台","电影",ignore=shutil.igore_patterns("*.html"))   #将movie/港台底下的所有东西,拷贝到目录“电影”中,但不拷贝拓展名为html的文件

#----------- ----压缩-----------------------
shutil.make_achieve("电影/gg","zip","movie/港台") #将港台压缩成gg.zip,放在电影文件夹下

#将1.txt和1.copy.txt压缩成a.zip,w表示写入模式
z1=zipfile.ZipFile("d:/a.zip","w")  
z1.write("1.txt")
z1.writ("1.copy.txt")
z1.close()

#将a.zip解压缩到“电影”文件夹下,r表示读取模式
z2=zipfile.ZipFile("d:/a.zip","r")  
z2.extractall("电影")
z2.close()