Python从入门到实战(一)——Python基础
Python从入门到实战(二)——程序流程控制
Python从入门到实战(三)——组合数据类型
Python从入门到实战(四)——函数
Python从入门到实战(五)——模块和包
Python从入门到实战(六)——文件
Python从入门到实战(七)——面向对象
Python从入门到实战(八)——异常
Python从入门到实战(九)——多线程
Python从入门到实战(十)——爬虫
文章目录
文件基础操作
什么是文件
文件是存储在外部介质上的数据集合,与文件名相关联。
按文件中的数据组织形式可以把文件分为两类:
- 文本文件
- 二进制文件
文件的打开和创建
文件变量名 = open(文件名[,打开方式[,缓冲区]])
示例如下
f1 = open('file1.txt','r') # 以只读方式打开
f2 = open('file2.txt','w') # 打开一个文件只用于写入
文件的打开方式
字符编码
编码是用数字来表示符号和文字的一种方式,是符号、文件存储和显示的基础。
文本文件的写入
文件指针的移动
- 写入文件后,必须打开才能读取写入的内容
- 读取文件后,无法再次读取读过的内容
- seek(n),其中n>=0,seek(0)表示文件指针移到文件头,n>0,表示移动到文件头之后的位置,从任意位置读取内容或从任意位置覆盖内容时需要这样做。
- seek(0,2)表示把文件指针移到文件尾,在追加新内容时需要这样做。
示例
把字符串 软通动力123@isoftstone
用UTF-8编码写入文件5_1.txt中,并显示文件的长度(总字节数)
s = '软通动力123@isoftstone\n'
f.write(s)
f.seek(0, 2) # 把文件指针移到文件尾
length = f.tell() # 文件尾的位置,其值刚好等于文件长度(字节数)
f.close()
print('文件长度=',length)
把文件5_1.txt中的”动力“替换为”教育“,再把”1“替换为”9“,最后在文件末尾增加”软件学院“。
# 把文件5_1.txt中的"动力"替换为"教育",再把"1"替换为9,最后在文件末尾增加“软件学院”
import codecs
# coding = gbk
f = codecs.open('5_1.txt','r+','gbk')
f.seek(4) # 文件指针移到'动'的首字节上,一个中文占2个字节
f.write('教育') # 用'教育'覆盖'大学'
f.seek(8) # 文件指针移到'1'上
f.write('9') # 用'9'覆盖'1'
f.seek(0, 2) # 文件指针移到文件尾
f.write('软件学院') # 增加新内容
f.close()
把王之涣的古诗《登鹳雀楼》按行写入文件5_2.txt中。
# 把王之涣的古诗《登鹳雀楼》按行写入文件5_2.txt中。
lst = ['白日依山尽\n','黄河入海流\n','欲穷千里目\n','更上一层楼']
f = open('5_2.txt','w')
f.writelines(lst)
f.close()
文件的关闭
文本文件读取
这里其实有点问题,对于二进制文件,每次是读size
个字节,但对于文本文件,是读size
个字符。
示例
读取文件5_1.txt的前9个字节,并显示
# 读取文件5_1.txt的前9个字节,并显示
f = open('5_1.txt','r')
s = f.read(9) # 读取文件的前9个字符
f.close()
print('s=',s)
print('字符串s的长度(字符个数)=',len(s))
读取文件5_1.txt的全部内容,并显示
# 读取文件5_1.txt的全部内容,并显示
f = open('5_1.txt','r')
s = f.read() # 默认读取文件全部内容
f.close()
print('s=',s)
使用readline()读取文件5_2.txt的每一行,并显示
# 使用readline()读取文件5_2.txt的每一行,并显示
import codecs
f = codecs.open('5_2.txt','r')
while True:
line = f.readline()
if line == '':
break
print(line,end = '')
f.close()
二进制文件写入
示例
把1个整数,1个浮点数,1个布尔型对象,1个字符串,存入二进制文件 5_3.dat中
# 把1个整数,1个浮点数,1个布尔型对象,1个字符串,存入二进制文件 5_3.dat中
import struct
n = 102400000
x = 10.24
bl = True
s = '软通动力123@isoftstone'
sn = struct.pack('if?',n,x,bl) # 'if?'表示要转换的类型
# 把整数n,浮点数x,布尔对象b依次转换为字节串
# print(sn)
f = open('5_3.dat','wb')
f.write(sn) # 写入字节串
b = s.encode('UTF-8') #字符串编码(encode)为 bytes
f.write(b)
f.close()
把1个整数、1个浮点数、1个字符串、1个列表、1个元组、1个集合、1个字典写入二进制文件
# 把1个整数、1个浮点数、1个字符串、1个列表、1个元组、1个集合、1个字典写入二进制文件F7_5.dat中
import pickle
f = open('5_4.bat','wb')
n = 7
i = 102400000
a = 10.24
s = '软通教育123abc'
lst = [[1,2,3],[4,5,6],[7,8,9]]
tu = (-5,10,8)
coll={4,5,6}
dic = {'a':'apple','b':'banana','g':'grape','o':'orange'}
try:
pickle.dump(n,f) # 表示后面将要写入的数据个数
pickle.dump(i,f) # 把整数i转换为字节串,并写入文件
pickle.dump(a,f)
pickle.dump(s,f)
pickle.dump(lst,f)
pickle.dump(tu,f)
pickle.dump(coll,f)
pickle.dump(dic,f)
except:
print('写文件异常!') # 如果写文件异常则跳转到此处执行
f.close()
struct
的pack
函数需要指定转换的类型,而pickle
的dump
函数不需要指定转换的类型。
二进制文件读取
读取二进制文件5_3.dat中的数据,并显示
# 读取二进制文件5_3.dat中的数据,并显示
import struct
f = open('5_3.dat','rb')
sn = f.read(9)
tu = struct.unpack('if?',sn)
# 从字节串sn中还原出1个整数、1个浮点数和1个布尔值,并返回元组
print(tu)
n = tu[0]
x = tu[1]
bl = tu[2]
print('n=', n)
print('x=', x)
print('bl=', bl)
s = f.read()
print('s=',s.decode('UTF-8'))
f.close()
读取二进制文件5_4.bat中的数据,并显示
# 读取二进制文件5_4.bat中的数据,并显示
import pickle
f = open('5_4.bat','rb')
n = pickle.load(f) # 读取文件的数据个数
i = 0
while i<n:
x = pickle.load(f)
print(x)
i += 1
f.close()
一维数据处理
一维数据的写入处理
- 采用空格方式将数据写入文件
# 采用空格分隔方式将数据写入文件
ls = ['中国','美国','德国']
f = open('1.txt','w')
f.write(' '.join(ls))
f.close()
- 采用特殊符号分隔方式将数据写入文件
# 采用特殊符号分隔方式将数据写入文件
ls = ['中国','美国','德国']
f = open('2.txt','w')
f.write('&'.join(ls)) # 用'&'分隔
f.close()
一维数据的读入处理
- 从空格分隔的文件中读入数据
# 从空格分隔的文件中读入数据
f1 = open('1.txt','r')
txt = f1.read()
f1.close()
ls = txt.split()
print(ls)
- 从特殊符号分隔的文件中读入数据
# 从特殊符号分隔的文件中读入数据
f1 = open('2.txt','r')
txt = f1.read()
f1.close()
ls = txt.split('&')
print(ls)
二维数据处理
二维数据的写入处理
# 二维列表
ls = [['1701','Zhangsan','男','19'],
['1702','Lily','女','18'],
['1703','Marry','女','19']]
fo = open('3.txt','w')
for item in ls:
fo.write(','.join(item)+'\n')
fo.close()
二维数据的读入处理
fo = open('3.txt') # 默认为 'r'
ls = []
for line in fo:
line = line.replace('\n','')
ls.append(line.split(','))
fo.close()
print(ls)
CSV文件格式读写
CSV数据存储格式
写入CSV文件
利用csv
模块的writer
函数进行写入
import csv
lst = [('北京','101.4','120.7','121.4'),
('上海','102.5','121.7','120.4'),
('广州','100.5','122.7','123.4')]
f = open('test.csv','w+',newline='')
w = csv.writer(f)
print(type(w))
for l in lst:
w.writerow(l)
f.close()
读入CSV文件
利用csv
模块的reader
函数
import csv
f = open('test.csv','r+')
r = csv.reader(f)
for x in r:
print(','.join(x))
f.close()
文件与文件夹的管理
主要使用os
模块
文件的相关操作
- 文件重命名:
os.rename()
os.rename('毕业论文.txt','毕业论文-最终版.txt')
- 删除文件:
os.remove()
os.remove("毕业论文.txt")
文件不存在会报错
- 判断文件是否存在:
os.access()
os.access('python3.dll',os.F_OK)
os.access()
还可以用于判断其他的
文件夹的相关操作
- 创建文件夹:
os.mkdir()
os.mkdir("张三")
文件夹已存在会报错
2. 获取当前目录os.getcwd()
os.getcwd()
- 改变默认目录
os.chdir()
os.chdir('../')
- 获取目录列表
os.listdir()
os.listdir("./")
既有文件,也有文件夹
5. 删除文件夹 os.rmdir()
os.rmdir("张三")
文件夹不存在会报错
上述只介绍了一些常使用的,以后有需要可以自己查文档找合适的方法使用。