zoukankan      html  css  js  c++  java
  • 文件

    文件打开方式
    f = open(file='文件路径+文件名', mode='打开方式', encoding='文件编码')  # 打开
    #操作
    pass
    f.close() #关闭

    打开方式:'r'(读)、'w'(写)、'a'(追加),默认以'r'方式打开

    以'r'打开,只能读不能写

    以'w'打开,只能写不能读,如果文件不存在则创建文件,如果文件已存在,则清空重写,慎用

    以'a'打开,追加写,打开文件在文件的末尾追加写入内容




    f = open('yesterday.txt','a',encoding = 'utf-8')#文件句柄
    使用('a')append可以在已存在的文件里写入,不可读
    使用('w')创建一个新文件来写入,不可读,如果文件已存在,清空重写
    使用('r')读取文件,不可写入
    使用('r+')读,追加可写,常用
    使用('w+')写读,没用
    使用('a+')追加可读
      以'a+'打开,文件指针位于末尾,如果要读需要先移动指针
    使用('rb') 用于二进制文件,不传encoding参数#用于网络传输
    使用('wb') 二进制写,不传encoding参数
    f = open('yesterday.txt','r+',encoding = 'utf-8')#文件句柄
    data = f.read()
    data2 = f.read()
    print(data)
    print(data2)
    # 读过一次之后光标移动到读过的内容的最后,
    # 再次读,只能读光标之后的内容
    # 所以第二次读文件没有输出
    f.write('-----data2-------')
    f.write('
    abc')
    print(data)
    
    f.close()

    可指定读取字符数

     1 f = open('yesterday.txt','r+',encoding = 'utf-8')#文件句柄
     2 data = f.read(4)
     3 data2 = f.read()
     4 print(data)
     5 print('*********')
     6 print(data2)
     7 
     8 >>>:-啊--
     9     *********
    10     --data2-------
    11     abc
    12 
    13 文件
    14 -啊----data2-------
    15 abc
    View Code

    逐行读取

    for line in f:
        print(line.strip())

    文件打开with模式,自动关闭

    with open('yesterday.txt',encoding = 'utf-8') as c:
        a = c.read()
        print(a)
    
    默认r方式打开

      文件编码问题:文件以什么编码写入,就要以什么编码读取,否则会乱码

      如果不知道文件是以什么编码写的怎么办?

    import chardet    # 第三方工具
    
    with open('test.txt', 'rb') as f:  # 必须以二进制模式打开
        content = f.read()
    
    result = chardet.detect(content)
    print(result)
    
    返回结果:
    {'encoding': 'utf-8', 'confidence': 0.7525, 'language': ''}

    其他

    print(f.readline())#返回一个生成器,调用一次读一行
    print(f.tell())#.tell()查找光标位置
    f.seek(0)#.seek()把光标移到指定位置,然后可再次读取
    print(f.readlines())#整个文件以列表形式返回,一行为列表的一个元素
    
    print(f.encoding)#.encoding()打印文件编码
    
    print(f.name)#打印文件名字
    
    print(f.seekable())#判断文件是否能移动光标
    
    print(dir(f.flush()))  #刷新,没什么用
    a=f.truncate(x)#从文件第一个字符开始截取x

    遍历文件

    f = open('yesterday.txt','r',encoding = 'utf-8')
    1.高效方法
    count = 0
    for line in f:
        if count == 9:
            print('------')
            
        else:
            print(line)
        count += 1
    2.low方法
    #print(f.readlines())#f.readlines()把文件生成列表,但是占内存
    for index,line in enumerate(f.readlines()):#找列表元素的索引
        #f.readlines()只适用于小文件,太占内存
        if index == 9:
            print('-------')
            continue
            print(line.strip())

    缓慢输出(进度条)

    import sys,time
    for i in range(20):
        sys.stdout.write('#')
        sys.stdout.flush()
        time.sleep(0.1)

    文件修改

    一、占硬盘方式(读到硬盘上修改)

    import os
    
    f = open('yesterday.txt','r',encoding='utf-8')
    f_new = open('yesterday2.txt','w',encoding='utf-8')
    for line in f:
        if 'radio,' in line:
            line = line.replace('radio','---')
            #对部分进行修改
        f_new.write(line)
    f.close()
    f_new.close
    
    os.rename('yesterday2.txt','yesterday.txt') #把新文件名替换成旧文件名,并删除旧文件

     二、占内存方式(读到内存上修改,如果文件太大,此方法不适用)

    with open('alex.txt', 'r+', encoding='utf-8') as f:
        content = f.read()  # 文件内容全部读到内存,返回字符串,不能逐行遍历
        if 'alex' in content:
            content = content.replace('alex', 'a')
        f.seek(0)   # 指针移动到文件头位置
    
        f.truncate(0)  # 文件字节长度发生变化,需要把文件清空重写
        f.write(content)

      f.seek(0)和f.truncate(0) 联合使用  

  • 相关阅读:
    结构体位域与规范定义顺序的问题
    visual studio 2015使用MFC的console调试打印
    MFC笔记
    MFC中解决文本保存到文件时乱码问题
    C/C++关于文件的读写操作以及文件的打开和保存
    MFC使用自定义消息
    MFC输入框CEdit控件十六进制转换
    Visual studio C++ MFC应用程序自动探测串口号
    visual C++ MFC串口编程overlapped结构汇总
    模块及模块间的接口方式
  • 原文地址:https://www.cnblogs.com/webc/p/8496457.html
Copyright © 2011-2022 走看看