• Python 文件读写与编码解读


    一、Python 读取文件使用open函数

    python open() 函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写。

    open(name[, mode[, buffering]])

    参数说明:

    • name : 一个包含了你要访问的文件名称的字符串值。

    • mode : mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。

    • buffering : 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。

    不同模式打开文件的完全列表:

    模式描述
    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
    w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

    二、python的open()方法用来打开一个文件。第一个参数时文件的位置和文件名,第二个为可选参数,指定打开读写的模式。

    例子:f=open(‘1.txt’,'w')
    使用open()打开文件后一定要记得关闭文件对象,

    f.close()
    可以用try()finally()确定关闭文件。
    file=open()
    try:
      atxt=file.read()
    finally:
      file.close()
    注:不能把open语句放到try块里面,因为打开文件出现异常时,文件对象无法close()
    三、.读取方法:
    read(【size】)
    readline([size])
    readlines([size])//读取缓存块大小的文件内容,可以用import io io.default.buffer.size查看缓存块的大小
    iter()方法//并没有吧文件内容全部导入内存,而是在next读取的时候才读入内存

    f.readline()读取文件一行的内容

    f.readlines()读取所有的行到数组里面[line1,line2,…lineN]列表

    在避免将所有文件内容加载到内存中,这种方法常常使用,便于提高效率。

    四、注意问题 Python 读取文件乱码结局方案:

    方案1:

    字符编码参考http://www.cnblogs.com/xinghaiyige/p/7381518.html

    文件读取编码方案:

    1、查看文件编码方式

         引入识别编码模块chardet,没有安装简单使用pip install chardet

         

    import chardet
    
    files = open('11.txt','r').read()
    print chardet.detect(files)
    
    
    print files.decode('UTF-8-SIG').encode('utf-8')
    
    #ANSI 编码代表 GBK 
    

      

    结果:

    {'confidence': 1.0, 'language': '', 'encoding': 'UTF-8-SIG'}
    dddd dddddddddd d
    中国人民共和国

    通过看结果编码,对txt文本进行decode解码,成unicode ,然后编码为utf-8

     解决方案2:

    文件直接读取

     其中,关于open的编码解释如下:

         读取时:内置的open()方法打开文件时,read()读取的是str,读取后需要使用正确的编码格式进行decode()。write()写入时,如果参数是unicode,则需要使用你希望写入的编码进行encode(),如果是其他编码格式的str,则需要先用该str的编码进行decode(),转成unicode后再使用写入的编码进行encode()。如果直接将unicode作为参数传入write()方法,Python将先使用源代码文件声明的字符编码进行编码然后写入。

        编码时:模块codecs提供了一个open()方法,可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。写入时,如果参数是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述操作。相对内置的open()来说,这个方法比较不容易在编码上出现问题。

       所以可以在读取的时候指定编码,这样可以避免很多问题,如下:

    # coding: GBK
    import codecs
    f= codecs.open('test.txt', encoding='UTF-8')
    #f = codecs.open('test.txt',encoding = 'UTF-8','IGNORE') u= f.read() f.close() print type(u)# <type 'unicode'> f= codecs.open('test.txt','a', encoding='UTF-8') # 写入unicode f.write(u) # 写入str,自动进行解码编码操作 # GBK编码的str s= '汉' print repr(s)# 'xbaxba' # 这里会先将GBK编码的str解码为unicode再编码为UTF-8写入 f.write(s) f.close()

      

    四、写入文件的问题

    写入文件时,执行write()后内容不会马上写入文件,要用f.close()或者f.flush()命令,才会写入。
    或者当写入的内容的大小大于缓存块的大小时,系统会自动将缓存块中的内容刷入文件,然后再继续相缓存中写入内容。(所以当文件足够大时系统也不一定会自动把所有内容都写入文件)
    3.文件的指针:
    当新建的文件时,指针指在文件的开始处,从0开始,当写入或读取内容时,文件的指针从0位置向后移动,当再次读取时,从指针的位置开始读取。因此当向文件写入内容后,要关闭文件再读取才会看到文件中有内容。
    要让文件中的指针回到某个位置可以用命令f.seek(偏移量,参数)参数包括os.SEEK.CUR os.SEEK.END os.SEEK.SET
    查看文件的指针所在位置的命令f.tell()

  • 相关阅读:
    BZOJ3781 小B的询问
    BZOJ3757 苹果树
    BZOJ1491 [NOI2007]社交网络
    BZOJ3754 Tree之最小方差树
    BZOJ1251 序列终结者
    BZOJ2259 [Oibh]新型计算机
    BZOJ1043 [HAOI2008]下落的圆盘
    D. 预定义变量
    A. 变量命名原则
    B. PHP变量的特点
  • 原文地址:https://www.cnblogs.com/xinghaiyige/p/9042031.html
Copyright © 2020-2023  润新知