首页 > 编程语言 >Python之文件操作

Python之文件操作

时间:2022-12-01 12:45:47浏览次数:42  
标签:文件 encoding Python utf8 print 操作 txt open

Python之文件的操作

  1. 操作文件之读文件

第一种:

f = open(r'd:\python\test\a.txt', 'r', encoding='utf8')
print(f.read())
f.close()

此种方法在调用以后,必须加一个close()方法,否则文件会占用你的内存,如果打开文件太多,内存会被撑暴。

第二种:

with open(r'd:\python\test\a.txt', 'r', encoding='utf8') as f:
    print(f.read())

此种方法在调用以后,不需要加close()方法,with会自动在调用完成以后关闭文件。建议使用这个方法。

统一说明:

两种方法中的open中的内容解释:

open(r'd:\python\test\a.txt', 'r', encoding='utf8')
'''
路径前的 r'路径' 指的是:
	这里的r的意思是转译,因为在python中(别的语言也有这种情况),\n \r等很多这种组合都有自己的含意,在开头加上r以后,就是告诉解释器,不要使用这些特殊的含意。

encoding前的r的意思是只读,这里除了r以外,还可以使用其它参数:
r(只读)  w(只写)  a(只追加)
rb(二进制读)  wb(二进制写)  ab(二进制追加)  注意二进制后面不能加encoding参数

encoding的意思是,告诉解释器,我们用的是哪个字符集
'''
  1. 操作文件之写文件
with open(r'a.txt', 'w', encoding='utf8') as f:
    f.write('Hello World, I am W!')

注意:w参数是“覆盖写入”,也就是每次写入文件时,会先将文件清空,再将新的数据写入到文件中。

  1. 操作文件之追加文件
with open(r'a.txt', 'a', encoding='utf8') as f:
    f.write('I am appending! 22222')

注意:a参数是“追加写入”,每次写入数据时,会将数据追加至文章尾部,但追加的数据不会自动加换行符,需要自己手工去添加。

文件操作模式

文件操作模式指的就是上面所写的“读取、写入、追加”三个操作,它们对应的参数是“r/w/a”。

t 文件模式

文件模式为默认的模式,上面所写的"r/w/a"三个模式其实全是"rt/wt/at",但是默认模式可以忽略结尾的t

特点:

  1. 只能操作文本文件
  2. 读写都是以字符为单位
  3. 需要指定encoding参数,如果不加参数则会采用计算机默认编码。

b 二进制模式

二进制模式需要自己指定,指定方法就是在"r/w/a"结尾加上字母b(bytes的缩写),如“rb/wb/ab”

  1. 可以操作任意类型的文件
  2. 读写都是以bytes为单位
  3. 不需要指定encoding参数,因为它已经是二进制模式了
  4. 如果要看实际内容,需要根据源文件的编码进行解码

文件之方法与操作

  1. read()

说明:

文件读取之光标问题说明:

当文件第一次打开时,光标会停留在文件开头

第一次print的时候,光标会根据字符进行移动,如果未指定,会移动到文件结尾。

在文件未close之前,光标会一直停留在文件结尾

此时如果再print,则不会再读取出数据来,因为光标已经在文件结尾了

'''
假设,我们有个文件 a.txt,内容为:
我是第一行
我是第二行
我是第三行
我是第四行
'''
# 这时我想将文件读取三遍,我们想的是会返回三遍,但是注意,执行完以后,文件只会返回一遍
with open(r'd:\python\a.txt', 'r', encoding='utf8') as f:
    print(f.read())	# 这时光标停留在“我是第四行”的结尾
    print(f.read()) # 文件还未close,光标还在文件结尾,再读取时,光标继续向右读内容,但光标右侧已经没有内容了,所以会返回空值。
    print(f.read()) # 原理同上

文件读取还可以设定读取的字符数量,注意不是按字节数,是按字符。如:

'''
根据以下验证可以得出,虽然数字、字母占用的字节数小,但返回值并不是按字节算的。
文件内容如下:

1a我的
'''
with open(r'd:\study\oldboy\day05\a.txt', 'r', encoding='utf8') as f:
    print(f.read(1))	# 返回 1
    
with open(r'd:\study\oldboy\day05\a.txt', 'r', encoding='utf8') as f:
    print(f.read(2))	# 返回 1a
    
with open(r'd:\study\oldboy\day05\a.txt', 'r', encoding='utf8') as f:
    print(f.read(3))	# 返回 1a我

with open(r'd:\study\oldboy\day05\a.txt', 'r', encoding='utf8') as f:
    print(f.read(4))	# 返回 1a我的

最后注意:

read()方法中如果不加字符数量的话,默认是读取整个文件的内容,如果文件太大,比如几十G的日志,会把内存撑爆。

  1. readline()

一次只读取一行内容

'''
文件内容:
我是第一行
我是第二行
我是第三行
'''
with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.readline())  # 只会返回“我是第一行”,如果想读取第二行需要再加一个print(f.readline())
  1. readlines()

文件会以列表的形式返回值,但注意会输出换行符。

'''
文件内容:
我是第一行
我是第二行
我是第三行
'''
with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.readlines())
# 返回值中有换行符\n
# ['我是第一行\n', '我是第二行\n', '我是第三行\n']
  1. readable()

查询文件是否可读,会返回布尔值

with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.readable())	# 返回 True
  1. write()

写入,上面已作过使用方法,此处不再重复介绍。

  1. writeable()

查看文件是否可写,返回布尔值

  1. writelines()

接收一个列表,一次性将列表中的数据值写入

l1 = ['1.我是第一行', '2.我是第二行', '3.我是第三行', '4.我是第四行']
print(l1)
with open(r'a.txt', 'w', encoding='utf8') as f:
    f.writelines(l1)
# 返回:1.我是第一行2.我是第二行3.我是第三行4.我是第四行
# 所以,如果要换行,需要手工在结尾加\n
  1. flush()

将内存中的数据,刷到硬盘

文件内的光标移动

根据上面的read()方法可以知道,读取完内容后光标会默认移动到结尾,那么,如何将光标移动回来呢?

使用方法:seek()

with open(r'a.txt', 'w', encoding='utf8') as f:
    f.write('123456\n')
    f.write('我是第二行\n')
    f.write('我是第三行')

with open(r'a.txt', 'r', encoding='utf8') as f:
    f.seek(4)
    print(f.read())
'''
返回值:

56				--->这里可以看到,光标移动了四个字节
我是第二行
我是第三行
'''

seek(offset, whence)

​ offset是位移量 以字节为单位

​ whence是模式,模式分为 0 1 2

​ 0 是指基于文件开头(光标在文件开头,再向右移动多少字节数),文本和二进制都可以使用

​ 1 是指基于当前位置(光标在当前位置,再移动多少字节数),只有二进制模式使用

​ 2 是指基于文件末尾(一般搭配seek(-n)使用,-n就是向左移动多少bytes),只有二进制模式使用

​ 注意:光标移动是按bytes字节数来算的,

文件的二进制操作(编码与解码)

encode() 编码:将字符编译为bytes模式

decode() 解码:将bytes模式解码为指定字符

with open(r'a.txt', 'w', encoding='utf8') as f:
    f.write('123456\n')
    f.write('我是第二行\n')
    f.write('我是第三行')

with open(r'a.txt', 'rb') as f:
    print(f.read())
'''
返回:
b'123456\r\n\xe6\x88\x91\xe6\x98\xaf\xe7\xac\xac\xe4\xba\x8c\xe8\xa1\x8c\r\n\xe6\x88\x91\xe6\x98\xaf\xe7\xac\xac\xe4\xb8\x89\xe8\xa1\x8c'
'''

使用进进制写入文件

s1 = '周末去哪玩?'.encode('utf8')
print(s1)
b'\xe5\x91\xa8\xe6\x9c\xab\xe5\x8e\xbb\xe5\x93\xaa\xe7\x8e\xa9\xef\xbc\x9f'
# 接下来将这个bytes类型写入到文件中
s1 = '周末去哪玩?'.encode('utf8')
with open(r'a.txt', 'wb') as f:
    f.write(s1)
with open(r'a.txt', 'rb') as f:
    print(f.read())
# 返回:b'\xe5\x91\xa8\xe6\x9c\xab\xe5\x8e\xbb\xe5\x93\xaa\xe7\x8e\xa9\xef\xbc\x9f'
# 读取也是二进制,那如何查看内容呢?使用解码。
with open(r'a.txt', 'rb') as f:
    print(f.read().decode(encoding='utf8'))

标签:文件,encoding,Python,utf8,print,操作,txt,open
From: https://www.cnblogs.com/smyz/p/16941073.html

相关文章

  • 利用Python手把手带上实现冒泡排序
    前言之前写过一篇关于Python算法分析的文章--《​​利用Python浅尝算法分析​​》,想要学好计算机,数据结构和算法几乎是无法回避的课题,因为我们学习编程第一节课老师都会......
  • Linux下用rm误删除文件的三种恢复方法
    对于rm,很多人都有惨痛的教训。我也遇到一次,一下午写的程序就被rm掉了,幸好只是一个文件,第二天很快又重新写了一遍。但是很多人可能就不像我这么幸运了。本文收集了一些在Lin......
  • python连接数据库
    一、python连接mysqlpython连接MySQL使用pymysql库。1、安装:pipinstallpymysql2、代码importpymysql#建立连接db=pymysql.connect(host="127.0.0.1",port=3306......
  • Python基础之公共操作
    ⼀、运算符1、+#1.字符串str1='aa'str2='bb'str3=str1+str2print(str3)#aabb#2.列表list1=[1,2]list2=[10,20]list3=list1+list2print(list3)#[......
  • Python 中os.path与sys.path的区别
    定义区别os.path主要是用于对系统路径文件的操作。sys.path主要是对Python解释器的系统环境参数的操作(动态的改变Python解释器搜索路径)。验证>>>importos,sys>>......
  • PYTHON 数据结构 - 集合
    1.1集合是一种可迭代的,无序的,不能包含重复元素的数据结构。集合的元素是不可变的,如:int,float,string,tuple等,可变的内容不可以是集合的元素,如:list,dict,set等。集......
  • windows桌面上删除文件夹或者文件后,显示还在,需要刷新一下才能不显示
    windows桌面上删除文件夹或者文件后,显示还在,需要刷新一下才能不显示,这是由于windows资源管理器出了问题,可以尝试以下方式打开我的电脑,最上面选择查看  右侧显示 ......
  • 最新版 苹果 IOS AppStore证书申请全流程 包括p12文件
    第一步登陆开发者网站并进入证书管理页。辅助工具网站地址:http://www.applicationloader.net/第二步添加【Certificates】证书。在这里插入图片描述第三步进入添加页后,根据......
  • Python高级-多继承以及MRO顺序-笔记
    1.单独调用父类的方法#coding=utf-8print("******多继承使用类名.__init__发生的状态******")classParent(object):def__init__(self,name):print('paren......
  • 最新版 苹果 IOS AppStore证书申请全流程 包括p12文件
     第一步登陆开发者网站并进入证书管理页。辅助工具网站地址:http://www.applicationloader.net/第二步添加【Certificates】证书。在这里插入图片描述......