第四章 Python之文件处理

时间:2023-01-01 11:44:13

文件操作

  文件操作一般分为三步:打开文件得到文件句柄并赋值给一个变量--->通过句柄对文件进行操作-->关闭文件

f=open(r'C:\Users\hesha\PycharmProjects\Sat_20171216\practice__file\a.txt','r',encoding='utf-8')
data=f.read()
f.close()
open()参数包括文件路径(r''代表原生路径),文件操作(如果为r则默认rt模式)和编码方式

  文件操作关键两点:字符编码和资源回收。我们可以使用with关键字来帮助我们管理上下文

with open('a.txt','r',encoding='utf-8') as f:
    data=f.read()   #读取所有内容
    print(data)

文件打开方式

  文件句柄=open('文件路径',‘模式’)

  模式可以是以下方式以及他们之间的组合

character meaning
'r' open for reading(default)
'w' open for writing,truncating the file list
'a' open for writing,appending to the end of the file if it exist
'b' binary mode
't' text mode
'+' open a disk file for updating(reading and writing)
'U' universal newline mode(for backwards compatibility;should not be used in new code)

  r(rt):只读文本模式;w(wt):只写文本模式;a(at):只追加文本模式

  b模式:对于非文本文件,我们只能用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码方式,图片文件的jgp格式、视频文件的avi格式),以b模式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

  '+':表示可以同时读写某个文件

  'x':只写模式

  ‘U’:表示在读取时,"U"表示在读取时,可以将\r \n \r\n自动转换成\n(与r或者r+模式同时使用)因为Windows系统的换行符为\r\n,Linux系统的换行符为\n,加上U则能自动把\r\n转换成\n

  'w'和'x'的区别:w为只写模式,不存在则创建,存在则清空内容;x为只写模式,不存在则创建,存在则报错

  'r+'与'w+'的区别:r+可读可写,若文件不存在,报错;w+可读可写,若文件不存在,创建

  'r+'与'a+'的区别:r+覆盖写,a+追加写

文件读写

   读文件:f.read(),f.readline(),f.readlines()

#read,realine和readlines用法
with open('a.txt','r',encoding='utf-8') as f:
    data=f.read()   #读取所有内容
    print(data)

with open('a.txt','r',encoding='utf-8') as f:
    data1=f.readline()    #读取文件每一行内容
    print(data1,end='') #print()函数自带换行,使用end=''去掉换行
    data2=f.readline()
    print(data2)
    data3=f.readline()
    print(data3)

with open('a.txt','r',encoding='utf-8') as f:
    data=f.readlines()  #读取文件每一行内容并存入列表
    print(data)

  写文件:f.write(),f.writelines()

#'w'模式写文件:没有文件则创建文件,有文件则清空文件,t模式打开的只能写字符串
with open('b.txt','w',encoding='utf-8') as f:
    f.write('111\n222\n333\n')  #针对't'模式的写,需要添上换行符

with open('b.txt','wb') as f:
    f.write('111\n222\n'.encode('utf-8')) #针对'b'模式的写,需要encode并添上换行符

with open('b.txt','w',encoding='utf-8') as f:
    f.writelines(['hahahh\n','heiheihei\n','hehehe\n']) #通过列表或元祖的形式写入文件内容

#'a'模式追加写:文件不存在则创建文件,存在则打开文件后将光标移动到文件末尾进行追加写
with open('b.txt','a',encoding='utf-8') as f:
    f.write('aaa\nbbb\n')

with open('b.txt','r',encoding='utf-8') as f:
    for line in f:
        print(line,end='')

   'b'模式进行文件写操作时,需要将字符串转换成bytes类型

with open('b.txt','rb') as f:
    print(f.read().decode('utf-8'))  #将读取的内容编码为utf-8模式

with open('b.txt','wb') as f:
    f.write(''.encode('utf-8')) #将字符串转成bytes类型

文件修改

  修改方法一:将硬盘存放的文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘

import os
with open('info.txt','r',encoding='utf-8') as read_f,\
    open('.info.txt.swap','w',encoding='utf-8') as write_f:
    data=read_f.read()      #全部读入内存,如果文件很大,会很卡
    data=data.replace('a','A')  #在内存中完成修改
    write_f.write(data)         #一次性写入新文件

os.remove('info.txt')
os.rename('.info.txt.swap','info.txt')

  修改方法二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

import os
with open('info.txt','r',encoding='utf-8') as read_f,\
    open('.info.txt.swap','w',encoding='utf-8') as write_f:
   for line in read_f:
        if 'A' in line:
            line=line.replace('A','a')
        write_f.write(line)
os.remove('info.txt')
os.rename('.info.txt.swap','info.txt')

文件内光标的移动

   f.read(3)

  以'r'模式打开文件时,‘3’代表读取3个字符,以'b'模式打开文件时,‘3’代表读取3个字节

  seek(),tell(),truncate()都是以字节为单位

  seek(offset,whence):offset表示开始的偏移量,也就是代表需要移动偏移的字节数,whence给offset参数一个定义,表示从哪个位置开始偏移,0代表从文件开头算起,1代表从当前位置算起,2代表从文件末尾算起。其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

with open('a.txt','r',encoding='utf-8') as f:
    data1=f.read()
    print('==1==>',data1)
    print(f.tell())   #光标在文件中的位置,只有一种情况是以字符的形式(文件以rt模式打开)
    f.seek(6,0) #第二个参数有三种方式,必须在b模式下才可以用1和2模式 1:以当前位置参照 2:以末尾参照

  truncate是截断文件,所以文件的打开方式必须可写为r+或a或a+(不能用w或w+的方式打开,因为那样直接清空文件了)

练习

(1)利用b模式,编写一个cp工具,要求如下:

  既可以拷贝文本又可以拷贝视频,图片等文件;

  用户一旦参数错误,打印命令的正确方法,如usage:cp source_file target_file

  提示:可以用import sys,然后用sys.argv获取脚本后面的参数

第四章 Python之文件处理第四章 Python之文件处理
#cp:注意文件大小和打开模式
import sys
#print(sys.argv)
if len(sys.argv) != 3:
    print('usage:cp source_file target_file')
    sys.exit()

_,src_file,dst_file=sys.argv
with open(src_file,'rb') as read_f,\
        open(dst_file,'wb') as write_f:
    for line in read_f:
        write_f.write(line)
        write_f.flush()
View Code

(2)修改文件内容,把文件中的‘hello’都替换成'bye'

第四章 Python之文件处理第四章 Python之文件处理
import os
with open('a.txt','r',encoding='utf-8') as read_f,\
      open('.a.txt.swap','w',encoding='utf-8') as write_f:
    for line in read_f:
        if 'hello' in line:
            line=line.replace('hello','bye')
        write_f.write(line)

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
View Code

(3)文件a.txt内容:每一行内容分别为商品,价钱,个数,并已空格分隔

  apple 10 3

  peach 8 4

  cherry 18 5

  orange 27 7

  求出本次购物花费的总钱数

第四章 Python之文件处理第四章 Python之文件处理
sum=0
with open('a.txt','r',encoding='utf-8') as f:
        for line in f:
            line_l=line.split()
            #print(line_l)
            price=int(line_l[1])
            num=int(line_l[2])
            good_sum=price*num
            sum+=good_sum
print('sum is %s'%sum)
View Code