Python 文件读写

Python中打开文件命令open(),open()命令返回文件的一个句柄:如:

f = open('e:\python.txt')

# read()对打开的文件进行读的操作
print(f.read())

# 关闭文件,文件打开后一定要记得关闭文件。在写的时候 可以:打开,关闭先写完,再写打开和关闭中间的代码
 f.close()

open 没有指定mode=参数,默认使用只读的方式打开文件,文件没有写的权限

f = open('e:\python.txt') 
#这段代码,open 没有指定 mode= 参数,默认使用只读的方式打开文件,文件没有写的权限
f = open('e:\python.txt')
f.write('hello python')
f.close()

上面的代码会报错, io.UnsupportedOperation: not writable
另外,如果没有使用为open指定encoding=参数,计算机默认使用系统的编码方式打开文件。windows下默认为gbk,linux下默认为utf-8
文件的打开方式格式:文件句柄=open(‘文件路径’,打开默认,编码方式)

文件打开方式

1.r,只读的方式打开(文件必须存在,如果文件不存在,则会抛出异常) 注:文件以什么方式编码方式写的,就以什么编码方式打开

f = open('e:\python.txt',mode='r',encoding='utf-8')
print(f.read())
f.close()

2.w, 只写模式 (文件不可读,如果文件不存在,则创建一个新的文件,如果文件存在,则会清空里面的内容)

f = open('e:\python.txt',mode='w',encoding='utf-8')
f.write('hello python!') # 在写的时候,要指定编码的方式
f.close()

3.a,只追加写的模式 (文件不可读,不存在则创建新的文件,文件存在的话,可在后面追加内容)

f = open('e:\python.txt',mode='a',encoding='utf-8')
f.write('jack is a student')
f.close()

对于非文本的文件,使用b的模式。'b’表示以字节的方式进行操作 如:rb,wb,ab 分别对应以上内容,如果以b的方式打开,读取到的内容是字节类型,写入的时候也需要提供字节类型,不能指定编码

f = open('e:\python.txt',mode='rb') # 指定encoding= 参数 会报错
print(f.read())  # b'\xd6\xd0\xb9\xfa
f.close()

'+'模式 ---- r+: 读写模式 w+:写读模式 a+:写读模式(追加)

f = open('e:\python.txt',mode='r+',encoding='gbk')
print(f.read())
f.write('helo')
print(f.read()) # 此处在读的时候,就读不到 后面的 hello了,因为,在执行完 write(’hello') 这段代码后,光标移动到了文件的末尾
f.close()

在 r+ 模式下,应该先读,后写,如果先写,后读,同样的道理,光标移动到了文件末尾,将读取不到内容

f = open('e:\python.txt',mode='w+',encoding='gbk')
f.write('你好,hellopython')  # 清空文件中的内容,然后重新写数据
f.seek(0)  # 将光标移动到文件开头
print(f.read())
f.close()
f = open('e:\python.txt',mode='a+',encoding='gbk')  # 在 a+ 模式下,将在文件的末尾追加数据,不会覆盖原来的内容
f.write('\njack is a student')
f.seek(0)  # 将光标移动到文件开头
print(f.read())
f.close()

文件读取的其他操作
很多时候,在读写文件的时候,只是打开文件,open 而忘记关闭文件,close,可以使用简单的方式来操作,使用with open。如:

l1 = ['静夜思','李白','床前明月光','疑是地上霜','举头望明月','低头思故乡']
with open('e:\\静夜思.txt',mode='w+',encoding='utf-8') as f:
     for l1_data in l1:
         f.write(l1_data + '\n')    # f.writelines(l1) 可以将列表l1中的内容全部写进去,但是不换行

     f.seek(0)  # 将光标放到文件首
     print(f.readlines()) # 逐行读取文件,并将文件按行为元素保存到一个列表中
     f.seek(3)
     index = f.tell() # 获取当前光标的位置
     print(index)  # 打印 3

关于seek 和 tell 这两个函数

with open('e:\python .txt',mode='w+',encoding='utf-8') as f:
    f.write('abcdefgh')  # 一共 8 个字符,现在想要读取ef两个字符
    f.seek(4)  # 将光标移动到4的位置,也就是 d 的后面,从e开始读取
    index = f.tell() #获取光标位置
    print(f.read(2),index) # 读取两个字符,将读到 ef
with open('e:\\123.txt',mode='w+',encoding='utf-8') as f:
    f.write('中国一定强')  # 在文件中写入: 中国一定强  按照 utf-8的编码方式写入
    f.seek(6)   # 将光标移动到位置 6
    index = f.tell()  # 读取光标的位置
    print(f.read(2),index)  # 读取两个字符

以上代码 输出 :一定 6
这里需要注意的是:移动光标 seek 以及 读取光标位置 tell 这两个函数,如果是英文字母。则一个字符为一个位置,如果是其他,按照编码方式来指定或者获取位置
中文 utf-8 的编码方式,一个汉字占用 3 个字节,所以 '中国’占用6个位置 在移动光标,或者获取光标位置的时候 要三个三个的移动
read 在读取的时候,按照能用眼睛看到的最小单位来读取