Python文件基本操作

Python文件基本操作详注

  • Python文件操作
      • 1.以指定的方式, 打开文件:open
      • 报错
      • 2.以指定方式,读取文件:read readline等
        • read函数
        • 按行读取
        • 遍历文件指针对象:最简单的按照行读取的方法
      • 3.以指定方式,写入文件:write/writelines
      • 4.tell函数返回当前文件指针在文件中的位置
      • 5.seek函数定位文件指针
      • 6.flush函数立即写入文件
      • 7.关闭文件的规范操作
          • with语句的优化作用:
    • 案例
      • 1.拷贝文件
      • 2.移除文件中的病毒代码

Python文件操作

1.以指定的方式, 打开文件:open

fp = open("xxx.txt",'w',encoding="utf-8")
fp.write("中国")
fp.close

fp = open("xxx.txt",'w',encoding="utf-8")

  • 只有open("xxx.txt")时,目的是获取文件句柄,如果没有该文件将会自动创建“xxx.txt”文件(无关打开之后的操作类型)

  • 但是:如果使用r,没有未找到改文件名,将会报错:FileNotFoundError: [Errno 2] No such file or directory: 'xxxx.txt'

    • w,a不会出现这种情况,它们会直接创建文件
  • 只有open("xxx.txt",'w')Python2默认是UTF-8编码,但是Python3将会根据系统(WINDOWS,MAC,LINUX)编码方式(中文简体是GBK)进行编码

  • utf-8与Unicode的区别主要区别在于:Unicode为世界上所有字符都分配了一个唯一的数字编号,UTF-8是Unicode编码的一种实现

  • r:读

  • w:写

  • a:追加

  • r+:读写方式打开文件

    特征案例:

    • 原文档为“汪帅是个”
    • 写入“老毛”
    • 结果:“老毛是个”

    也就是指针从文档开始部分写入文件

  • w+:读写方式打开文件

    w操作相同。

    但是,特征案例中:

    • fp = open("xxx.txt",'w+')步骤总是先使用“xxx.txt”替换原始文件,然后再写入
    • 也就是说fp = open("xxx.txt",'w+')后面紧跟着fp.read(),也只能读出空字符

    因此,使用W+是一种方式,先写再读

    但是,这时候要读的话,文件指针在文件最末尾还是读取的空字符

    因此,必须把文件指针,移动到自己想要的位置处

    • 例如,移动到最前面:fp.seek(0,0)
  • a+:追加和读的方式

    fp = open('xxxx.txt','a+')
    fp.write('\n'+"中国"*2)
    str = fp.read()
    print(str)
    fp.close()
    

    文件指针一样,这时候读取的是空字符

报错

Unicode编解码问题详解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YOpqAKeJ-1570455739106)(C:\Users\蚩尤克里里\AppData\Roaming\Typora\typora-user-images\1570444538053.png)]

#fp = open("xxx.txt",'r',encoding='utf-8')#相当于告诉open函数以‘utf-8打开文件’
#fp.write("中国")
fp = open('xxx.txt','rb')
str = fp.read()
print(str.decode('utf-8'))
fp.close()

2.以指定方式,读取文件:read readline等

  1. read函数

    • 默认:全部读取
    • 指定字节:read(5)即为读取前五个字节
  2. 按行读取

    • 每次读取一行:readline()

      任务:使用readline遍历文件中所有的行数据

      • 注意:无法使用for循环的,只能采用while循环
      while True:
          line = fp.readline()
          if not line:#如果没有这一行,break
              break
          #相应操作
          print(line)
      
    • 按行的形式将所有文件读取完:readlines()

      • 此时:可以用for循环遍历fp.readlines()
  3. 遍历文件指针对象:最简单的按照行读取的方法

    fp = open(fname,'r')
    for line in fp:
        print(line)
        # line是字符串属性,但它代表一行字符串
        # fp虽然是指针,但它代表整个字符串
    fp.close
    
    • fp作为文件指针
      • 实质是一个迭代器,因此在for循环中可以不断迭代

3.以指定方式,写入文件:write/writelines

fp.writelines(['a','c','b'])
  • 注意writeline不会换行

  • write函数只能写入字符串

    TypeError: write() argument must be str, not list

  • writelines函数参数能写入数组

4.tell函数返回当前文件指针在文件中的位置

fp.tell()

5.seek函数定位文件指针

seek(offset,from)
# offset:偏移量,可正可负
# from:相对位置,0表示开头,1表示从当前位置,2表示文件末尾

6.flush函数立即写入文件

fp.flush()

7.关闭文件的规范操作

  • 文件读取
  • 接着写入
  • 应该用“try……except……finally……”包围起来,以免数据丢失
try:
	fp = open('fname','r+')
	fp.read()
    fp.write()
except:
    print('Error')
finally:
    f.close()

使用with语句优化文件操作

with open('fname','r+') as fp:
    fp.read()
    fp.write()
    # ……
with语句的优化作用:
  1. 无需写try……except……finally……
  2. 相当于fp = open('fname','r+')
  3. 不仅仅是针对文件的打开关闭操作
  4. 实质是上下文管理器:是一种支持 __enter__和 __exit__这两个方法的对象

案例

1.拷贝文件

#思路1:A文件=>[]=>B文件
fname = "【问题】十万个为什么记录本"
lines = []
with open(fname+".txt",'r',encoding='utf-8') as fp:
    for line in fp:
        lines.append(line)
with open(fname+"Copy.txt",'w') as fp1:
    fp1.writelines(lines)
  • Error1:for line in fp:line是字符串(本质是指针对象)
  • Error2:lines = []是数组,lines.append(line)
    • 我犯的错误是:lines = fp.append(line)
    • 逻辑不通!!!
#思路2:A文件=>B文件
fname = "【问题】十万个为什么记录本"
# lines = []
# with open(fname+".txt",'r',encoding='utf-8') as fp:
    # for line in fp:
        # lines.append(line)
# with open(fname+"Copy.txt",'w') as fp1:
    # fp1.writelines(lines)
    
    
with open(fname+".txt",'r',encoding='utf-8') as fp:
    with open(fname+"Copy.txt",'w') as fp1:
        for line in fp:
            fp1.write(line)

2.移除文件中的病毒代码

# 思路:使用.startswith("string")函数
lines = []
for line in fp:
    if line.startswith("
                    
                    

你可能感兴趣的:(Python,文件读取,文件写入,拷贝文件)