python 3 基础之文件操作

文件操作

文件的读写操作需要借用函数 open() 完成

  使用格式:open(文件名,访问模式)

  下面是访问模式对照表

访问模式 说明
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式
w

打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件

a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
w+   打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

 

文件的操作流程:

  打开文件(创建文件)——>文件读写——>关闭文件

  文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的;

  用什么方式打开的文件就只能干什么,如:不能用写的方式打开文件去读取文件

1、文件的读取

  打开一个文件filename.txt,用只读模式打开

# 以只读模式 打开文件filename
f = open('filename.txt','r')
print(f.read())
f.close()

2、文件的写入(也可以用于创建一个新文件)

  打开一个新的文件并写入内容(多行内容写入可以用三引号保持文本格式) 

# 以写入模式写入内容
f = open('lianxi.txt','w')
f.write('''tar -xvf filename
select * from students
select * from students order by ageselect * from students order by age limit 1
create function liaotian ()''')
f.close()

  创建一个新的文件

# 创建一个空的文件xinfile.txt
f = open('xinfile.txt','w')
f.close()

  在文件末尾追加字符串

f = open('lianxi.txt', "a")
f.write("nihao")
f.close()

 

3、文件常用的方法

  3.1、readlines()

    readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素

f = open('lianxi.txt','r')
print(f.readlines())
f.close()

===============================
运行结果:['tar -xvf filename\n', 'select * from students\n', 'select * from students order by ageselect * from students order by age limit 1\n', 

'create function liaotian ()']

  3.2、readline()

    读取打开文件的第一行

  3.3、write()

    用于文件的写入,请看第 2 段内容

  3.4、tell()

    返回文件的当前位置,即文件指针当前位置;在读写文件的过程中,如果想知道当前的位置,可以使用tell()来获取

f=open('/tmp/passwd',mode='r')  #以只读模式打开/tmp目录下的passwd文件
print(f.tell())                 #输出0
content=f.read()
print(content)
print(f.tell())                 #输出2287,即文件的末尾
f.close()                       #文件操作之后,必须关闭文件

  3.5、seek() 

    如果在读写文件的过程中,需要从另外一个位置进行操作的话,可以使用seek()。
    seek(offset,from)有2个参数
    offset:偏移量
    from:方向
    其中偏移量小于0,表示左移(比如-1表示左移1位);偏移量为0,表示不动;偏移量大于0,表示右移(比如1表示右移1位);其中from表示方向(0表示文件开头;1表示当前位置;2表示文件末尾)
    此方法参考:https://blog.csdn.net/qq_42303254/article/details/86608779

f=open('/tmp/passwd',mode='r') #以只读模式打开/tmp目录下的passwd文件
print(f.tell())                #输出0
content=f.read()
print(content)
print(f.tell())                #输出2287,即文件的末尾
f.seek(1,0)                    #表示将指针移到文件的开头,再向右移一个字节(即移到字节为1的位置
print(f.tell())                #输出1
print(f.read())                #输出第一个字节后面所有的文件内容
f.close()                      #文件操作之后,必须关闭文件

  3.6、read()

    read() 默认用于读取整个文件的内容,read(3) 若输入参数,则为读取的字符个数

f = open('lianxi.txt','r')
# 读取整个文件内容
print(f.read())
# 读取10个字符
# print(f.read(10))
f.close()

4、文件读写中文(编码)和中文解码

  写入数据(默认情况win系统(中国)保存中文,编码格式为gbk),(mac电脑或者是linux 没有问题)

  用write写入中文文件内容的时候,若未用encoding声明utf-8,读取数据时也不用,可以用read等方法读取成功,显示也没问题;但直接打开文件时显示的是乱码

  用write写入中文内容时,若用encoding声明utf-8,读取数据时也必须要用encoding声明,否则报错或者是读取的是乱码

# 在文件后追加内容有中文,需要编码,用encoding=声明
k = open('lianxi.txt','a',encoding='utf-8')
k.write('\n中国广东省')
k.close()
# 文件读取时有中文,需要用encoding= 解码,否则会有乱码
f = open('lianxi.txt', "r",encoding='utf-8')
print(f.read())
f.close()

 5、执行完with语句内容之后,自动关闭文件对象

  with语句打开文件时可以起个别名,单个文件别名后面用冒号,多个文件打开用逗号和反斜杠  ,\  隔开;格式如下

  with open(文件名,模式) as 别名,\

    open(文件名,模式) as 别名:

    操作内容

'''
案例:将/tmp/passwd文件中的内容复制到/tmp/passwdbackup文件中
'''
#同时打开两个文件对象
with open('/tmp/passwd') as f1,\
    open('/tmp/passwdbackup','w+') as f2:
    #将第一个文件的内容写入到第二个文件中
    f2.write(f1.read())
    #移动指针到文件最开始
    f2.seek(0,0)
    print(f2.read())

6、制作 文件的备份

  文件备份的步骤:打开文件——>读取文件数据——>创建一个源文件的复制文件——>把文件读取复制到备份文件中

  示例代码:

# 使用with语句
with open('filename','r') as f,\
    open('filename[复件]','w') as ff:
    ff.write(f.read())

7、文件的相关操作

  对文件系统的访问大多通过 Python 的 os 模块实现. 该模块是 Python 访问操作系统功能的主要接口

  用人话说就是:想要对文件进行重命名、删除、创建文件夹等操作,需要先导入python的OS模块,接着用点方法进行操作

  7.1、文件的重命名 (在同级目录文件下运行)

    格式:os.rename('旧文件名' ,'新文件名')

# 导入模块OS
import os
# 重命名
os.rename('hm.txt','xuexi.txt')

  7.2、删除文件

    os模块中的remove()可以完成对文件的删除操作

    格式:os.remove('文件名')

import os
os.remove('hm.txt')

  7.3、创建文件夹

    格式:os.mkdir('文件夹名')

import os
os.mkdir('filename')

  7.4、获取当前目录

    格式:os.getcwd()

import os
print(os.getcwd())

  7.5、删除空文件夹

    格式:os.rmdir('空文件夹名称')

import os
os.rmdir('空文件夹名')

  7.6、获取目录列表

    格式:os.listdir()

import os
print(os.listdir())

  7.7、指定操作目录(在当前目录下,可以用此方法去非当前目录下操作文件)

    格式:os.chdir('目录')

import os
# 把操作的目录指定为 /mnt/soft
os.chdir('/mnt/soft')
ret = os.getcwd()
print(ret)

关于文件的其他一些操作,请看:https://blog.csdn.net/qq_42303254/article/details/86608779

8、批量操作文件

  批量创建文件

import os
# 当前目录下创建一个文件夹
os.mkdir('批量文件')
# 指定默认目录
os.chdir('批量文件')
print(os.getcwd())
# 在批量文件里创建10个文件
for i in range(1,11):
    #打开文件
    f=open('piliangwenjian%s.txt' % i,'w')
    #关闭文件
    f.close()

  批量改名

import os
# 批量修改文件名
# 1.先指定默认目录
os.chdir('批量文件')
# 2.获取当前目录下的目录列表(即‘批量文件’目录下的目录列表)
my_list = os.listdir()
print(my_list)
# 3.遍历my_list
for filename in my_list:
    newfilename = filename.replace('.txt','[中国].txt')
    os.rename(filename,newfilename)
# 多次运行不会报错,只会继续把文件名继续修改

 9、文件操作常用的模式

  常用打开模式:

  r 只能读
  r+ 可读可写,不会创建不存在的文件,从顶部开始写,会覆盖之前此位置的内容
  w+ 可读可写,如果文件存在,则覆盖整个文件,不存在则创建
  w 只能写,覆盖整个文件,不存在则创建
  a 只能写,从文件底部添加内容 不存在则创建
  a+ 可读可写 从文件顶部读取内容 从文件底部添加内容 不存在则创建

  但是实验发现,这里的r+ 可读可写 不会创建不存在的文件 从顶部开始写 会覆盖之前此位置的内容不完整

  此节参考自:https://www.cnblogs.com/yangshl/p/6285942.html

 

posted @ 2020-07-06 14:44  吾言!  阅读(233)  评论(0编辑  收藏  举报