python 08 文件操作
ctrl + s 保存至磁盘
.exe .txt .ppt .jpg 文件格式
open() 函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写
open(filename, mode)
filename:包含了你要访问的文件名称的字符串值。
mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | + | + | + | + | ||
写 | + | + | + | + | + | |
创建 | + | + | + | + | ||
覆盖 | + | + | ||||
指针在开始 | + | + | + | + | ||
指针在结尾 | + | + |
当前文件路径 /Users/magick/python
文件名 mo.txt
文件内容
1 one
2 two
>>> f=open(r'/Users/magick/python/mo.txt','r')
>>> f
<_io.TextIOWrapper name='/Users/magick/python/mo.txt' mode='r' encoding='UTF-8'>
>>> list(f)
['1 one\n', '2 two']
f.close() 关闭文件(关闭时缓存文件内容)
为了读取一个文件的内容,调用 f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。
size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回。
f=open(r'/Users/magick/python/mo.txt','r')
print(f.read())
执行结果
1 one
2 two
f.readline() 会从文件中读取(当前)的一行。换行符为 '\n'
f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行。
f=open(r'/Users/magick/python/mo.txt','r')
print(f.readline ())
执行结果
1 one
f.readlines() 将返回该文件中包含的所有行。
如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割。
f=open(r'/Users/magick/python/mo.txt','r')
print(f.readlines ())
执行结果
['1 one\n', '2 two']
迭代一个文件对象然后读取每行
f=open(r'/Users/magick/python/mo.txt','r')
for l in f:
print(l,end='')
执行结果
1 one
2 two
f.write(string) 将 string 写入到文件中, 然后返回写入的字符数。
f=open(r'/Users/magick/python/mo.txt','w') #w为写入(覆盖)
num = f.write("5") #用字符串'5'覆盖原文件,字符数为num=1
print(num) 1
f.close()
如果要写入一些不是字符串的东西, 那么将需要先进行转换:
f=open(r'/Users/magick/python/mo.txt','w')
num = (2,"a")
n=str(num)
f.write(n)
$ cat mo.txt
(2, 'a')
f.name 查找文件所在系统位置(文件名)
>>> f.name
'/Users/magick/python/mo.txt'
如果要改变文件当前的位置, 可以使用 f.seek(offset, from_what) 函数。
from_what 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:
seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符
seek(x,1) : 表示从当前位置往后移动x个字符
seek(-x,2):表示从文件的结尾往前移动x个字符
f.tell() 返回文件对象当前所处的(指针)位置, 它是从文件开头开始算起的字节数。
f.read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有。
>>> f=open(r'/Users/magick/python/mo.txt','rb+')
>>> f.write(b'1234567890')
10
>>> f.seek(5) 移动到第六个
5 第6个(从0开始)
>>> f.read(1) 读取第一个数字
b'6'
>>> f.tell() 显示当前(指针)位置
6
>>> f.seek(-2,2) 移动到倒数第二个
8 第9个(从0开始)
>>> f.read(1) 读取第一个数字
b'9'
>>> f.tell() 当前(指针)位置
9
>> f.seek(0,0) 返回最初的位置
>>for e in f: 迭代f的全部内容
print(e)
python文件写入也可以进行网站爬虫
以下代码是打开project.txt文件,并向里面写入http://www.baidu.com网站代码
from urllib import request
response = request.urlopen("http://www.baidu.com/") # 打开网站
fi = open("project.txt", 'w') # open一个txt文件
page = fi.write(str(response.read())) # 网站代码写入
fi.close() # 关闭txt文件
input() 默认输入的为 str 格式,若用数学计算,则需要转换格式,例:
a=input('请输入数字:')
print(a*2)
假设输入数值为3,则上例中得出结果为:
33
若将代码修改为:
a=int(input('请输入数字:'))
print(a*2)
则结果为:
6
实践
文件内容
1:1213
2:121321
1:1323
-----
1:22324
2:2232341
1:2242415
-----
1:321515
2:321515
1:315253
文件名record.txt
1:开头的单独保存为boy_*.txt
2:开头的单独保存为girl_*.txt
不同段落(-----)分割
三段分别保存为
boy_1.txt , boy_2.txt , boy_3.txt
girl_1.txt , girl_2.txt , girl_3.txt
def save_file (boy,girl,count): #保存 f_name_boy = 'boy_'+ str(count) + '.txt' #定义名字,用名字提示第几次分割 f_name_girl = 'girl_'+ str(count) + '.txt' boy_file = open(f_name_boy,'w') #用定义的名字创建文件 girl_file = open (f_name_girl,'w') boy_file.writelines(boy) #把boy的内容写入文件中 girl_file.writelines(girl) boy_file.close() #关闭文件 girl_file.close() def split_file(file_name): #分割 f= open('record.txt') boy = [] girl = [] count = 1 for e in f: if e[:5] != '-----': (role,l) =e.split(':',1) #e.split(':',1) :的左右分割,左role,右l if role == '1': boy.append(l) #写入boy,此时boy为列表 if role == '2': girl.append(l) #写入girl列表 else: save_file(boy,girl,count) #此时迭代至分割线,把上一轮的列表数保存 boy=[] #带入保存函数,清空列表 girl=[] count += 1 #进入下一次分割 save_file(boy,girl,count) #跳出迭代,保存最后一组数据 f.close() #关闭文件 split_file('record.txt')
整体思路:
准备两个列表
迭代文件
没有遇到分割线时
:左右分割,符号条件的放到对应列表中
遇到分割线时保存列表数据至文件,回到迭代判断处,准备下一次
保存文件可使用函数dfl
用名字提示第几次分割
创建文件
把数据写入文件中
关闭文件
所以要接收数据,第几次分割
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py
模块可以被别的程序引入,以使用该模块中的函数等功能(标准库)
有os模块,不用关心操作系统下使用什么模块
os模块会自动选择正确的模块并调用
>>import os #引用os模块
>>os.getcwd() #当前工作目录
'/Users/magick/python'
>>> os.chdir('/Users/magick') #修改工作目录,移动
>>> os.getcwd()
'/Users/magick'
>>> os.listdir() #列举当前目录的文件
['Music', '.DS_Store', '.CFUserTextEncoding', '.idm', 'python', 'Pictures', 'Desktop', 'Library', '.bash_sessions', '.mplayer', 'PycharmProjects', 'Public', '.dropbox', 'Python 3.7', '.idlerc', 'Movies', 'Applications', 'Dropbox', '.Trash', 'Documents', '.bash_profile', 'Downloads', '.bash_history', '.viminfo']
>>> os.mkdir('/Users/magick/a') #创建单层目录(文件)
>>> os.mkdir('/Users/magick/a/b') #a存在的情况下创建b
>>> os.mkdir('/Users/magick/c/b') #不存在c,所以不能在c中创建b,报错
>>> os.mkedirs('/Users/magick/a/b') #递归创建多层目录,需要包含子目录
>>> os.rmdir('/Users/magick/a/b') #删除路径目录,仅当这个文件夹是空的才行
>>> os.mkdir('/Users/magick/python/a/a')
>>> os.mkdir('/Users/magick/python/a/a/a')
>>> os.mkdir('/Users/magick/python/a/a/a/a')
>>> os.removedirs('/Users/magick/python/a/a/a/a') #递归删除目录如果子文件夹成功删除尝试它们的父文件夹
>>> os.listdir()
['c', 'b']
>>> os.listdir()
['.DS_Store', 'c', 'b']
>>> os.unlink('.DS_Store') #删除文件,如果文件是一个目录则返回一个错误
>>> os.listdir()
['c', 'b']
>>> os.listdir()
['c', 'b']
>>> os.rename('c','a') #命名(修改)文件或目录
>>> os.listdir()
['a', 'b']
os.curdir 指代当前目录
os.pardir 指代上一级目录
os.path 模块
import os 引用os模块时就已经引用了os.path
>>os.path.basename('/Users/magick/a.txt') #去掉目录路径,单独返回文件名
a.txt
>>>>os.path.basename('/Users/magick/a.txt') #去掉文件名,单独返回目录路径
/Users/magick
>>os.path.join('c:\\','a','b') #各部分组合成一个路径名
c:a\\b
>>os.path.split('c:\\a\\b.txt') #分割文件名与路径
('c:\\a','b.txt')
>>os.path.splitext('c:\\a\\b.txt') #分离文件名与扩展名
('c:\\a\\b','txt')
os.getatime 返回指定文件最近的访问时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
import time
os.path.getatime('c:\\a\\b.txt') 返回浮点型秒数
time.gmtime(os.path.getatime('c:\\a\\b.txt')) 返回日期
os.getctime(file) 返回指定文件的创建时间
os.getmtime(file) 返回指定文件最新的修改时间