编码相关:
字符串类型(str),在程序中用于表示文字信息,本质上是unicode编码中的二进制。
name = '卢本伟'
字节类型(bytes)
name = '卢本伟'
data = name.encode('utf-8')
print(data) # b'\xe5\x8d\xa2\xe6\x9c\xac\xe4\xbc\x9f'
- 可表示文字信息,本质上是utf-8/gbk等编码的二进制(对unicode进行压缩,方便文件存储和网络传输。)
- 可表示原始二进制(图片、文件等信息)
open()函数:
with open('xxx.txt',mode = 'w',encoding = 'utf-8') as f:
第一个参数为文件路径,第二个参数为文件的打开模式,第三个参数为文件读取或者写入时是以什么编码方式进行的,不相符将会出现乱码。
由于文件内容以Unicode编码形式会临时存储在内存中,在写文件时可以加以下一句,作用是每写一些,都会将其从缓冲区刷新到硬盘中。
#案例 把文件中的卢本伟替换成卢某,文件名不可改变。
import shutil
with open('old.txt', mode='r', encoding='utf-8') as f1, open('new.txt', mode='w', encoding='utf-8') as f2:
for line in f1:
new_line = line.replace('卢本伟', '卢某')#replace 不会对自身进行修改
f2.write(new_line)
# 不是写到了硬盘,而是写在缓冲区,系统会将缓冲区的内容刷到硬盘。
f2.flush()
shutil.move('new.txt', 'old.txt')#将前者移动/重命名为后者,如果后者已经存在,将其覆盖掉。
读取图片视频等的时候,如 mode = 'rb' ,不支持encoding参数,此时不写。其它以python或者原本文件默认编码方式进行。
文件打开的两种方法:
方法一:
f = open('xxx.txt',mode = 'r')
f.read()
f.close()
以该种方式直接open打开的文件要记得关闭,本人一般用下面的方法。
方法二:
with open('xxx.txt',mode = 'r',encoding = 'utf-8') as f:
f.read()
with自带关闭功能,称with上下文管理。
关于文件的常见打开模式:
-
只读:
r
、rt
、rb
(用)-
存在,读
-
不存在,报错
-
-
只写:
w
、wt
、wb
(用)-
存在,清空再写
-
不存在,创建再写
-
-
只写:
x
、xt
、xb
-
存在,报错
-
不存在,创建再写。
-
-
只写:
a
、at
、ab
【尾部追加】(用)-
存在,尾部追加。
-
不存在,创建再写。
-
-
读写
-
r+、rt+、rb+,默认光标位置:起始位置
-
w+、wt+、wb+,默认光标位置:起始位置(清空文件)
-
x+、xt+、xb+,默认光标位置:起始位置(新文件)
-
a+、at+、ab+,默认光标位置:末尾
-
注:对于一些方法,文件不存时在会报错,可以加上os模块的操作判断文件是否存在。
import os
f_path = r'xxx\xxx\x\xxx.txt'
exists = os.path.exists(f_path)
if exists:
# 1.打开文件
file_object = open('xxx.txt', mode='rt', encoding='utf-8')
# 2.读取文件内容,并赋值给data
data = file_object.read()
# 3.关闭文件
file_object.close()
print(data)
else:
print("文件不存在")
路径相关:
分清绝对路径和相对路径
windows系统由于路径用 \ 拼接,\ 为字符串中的特殊字符,会发生报错,所以写路径时可以用以下两种方法解决:
path1 = 'xx\\xxx\\xx.txt' #对\进行转译
path2 = r'xx\xxx\xx.txt' #加上r后变为原始字符串,则不会对字符串中的"\t"、"\n"等 进行字符串转义
常见功能:
以下默认mode = 'r',encoding = 'utf-8'
f.read()
读 返回整个字符出,即整个文本内容。
f.read(1)
mode = 'r' 的话,读取1个字符。
mode = 'rb'的话,读取1个字节。由于某文件以utf-8存储,想要读取文件光标后第一个内容且该内容的汉字,应该将后面的参数改为3。
f.readline(),读一行
一般可用于跳过标题或者列表表头,返回光标后的一行字符串,光标到下一行开始。
如果文件结束了还向下读,内容为空。
f.readlines(),读全部
返回一个列表,成员为光标后的每一行字符串。
注:对于行的操作,在文件中除了最后一行,基本每一行末尾都会有'\n',我们的回车换行(可看作隐藏\n)与print自带的换行会出现重复,如['xxx\n','xxxxxx\n','xx']。多打印出一个换行。可以用strip操作或者end=''。
循环读取
f = open('info.txt', mode='r', encoding='utf-8')
for line in f:
print(line.strip())
f.close()
f.write('xxx今天没写作业')
写内容,把括号里的东西写入文件。
f .flush()
刷到硬盘
f.seek(3)
移动光标位置,以上3代表移动3个字符。在a模式下,调用write在文件中写入内容时,永远只能将内容写入到尾部,不会写到光标的位置。
f.tell()
获取当前光标位置
注:光标索引也是从0开始,开始执行f.seek(3) 再执行f.tell()结果为3.此外,换行符\n也占位置。
注意,以上两者只适用于ASCII文件,因为tell和seek使用字节位置。基于行的工作很容易将字符串从字节转换为unicode字符串。