python文件读写理解

编码相关:

字符串类型(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上下文管理。

关于文件的常见打开模式:

  • 只读:rrtrb (用)

    • 存在,读

    • 不存在,报错

  • 只写:wwtwb(用)

    • 存在,清空再写

    • 不存在,创建再写

  • 只写:xxtxb

    • 存在,报错

    • 不存在,创建再写。

  • 只写:aatab【尾部追加】(用)

    • 存在,尾部追加。

    • 不存在,创建再写。

  • 读写

    • 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字符串。

猜你喜欢

转载自blog.csdn.net/suic009/article/details/120644570