zoukankan      html  css  js  c++  java
  • Python:文件的读取、创建、追加、删除、清空

    来源:http://www.open-open.com/lib/view/open1413527388231.html

    一、用Python创建一个新文件,内容是从0到9的整数, 每个数字占一行:
    #python
    >>>f=open('f.txt','w')    # r只读,w可写,a追加
    >>>for i in range(0,10):f.write(str(i)+' ')
    .  .  .
    >>> f.close()
    二、文件内容追加,从0到9的10个随机整数:
    #python
    >>>import random
    >>>f=open('f.txt','a')
    >>>for i in range(0,10):f.write(str(random.randint(0,9)))
    .  .  .
    >>>f.write(' ')
    >>>f.close()
    三、文件内容追加,从0到9的随机整数, 10个数字一行,共10行:
    #python
    >>> import random
    >>> f=open('f.txt','a')
    >>> for i in range(0,10):
    .  .  .     for i in range(0,10):f.write(str(random.randint(0,9))) 
    .  .  .     f.write(' ')    
    .  .  .
    >>> f.close()
    四、把标准输出定向到文件:
    #python
    >>> import sys
    >>> sys.stdout = open("stdout.txt", "w")
    >>>  . . .

    五、文件的读写

    1、文件打开:

    f = file(name[, mode[, buffering]])

    入口参数:   name 文件名

                      mode   选项,字符串

                      buffering   是否缓冲 (0=不缓冲,1=缓冲, >1的int数=缓冲区大小)

    返回值 : 文件对象

    mode 选项:

    "r"   以读方式打开,只能读文件 , 如果文件不存在,会发生异常      

    "w" 以写方式打开,只能写文件, 如果文件不存在,创建该文件

                                                         如果文件已存在,先清空,再打开文件

    "rb"   以二进制读方式打开,只能读文件 , 如果文件不存在,会发生异常      

    "wb" 以二进制写方式打开,只能写文件, 如果文件不存在,创建该文件

                                                         如果文件已存在,先清空,再打开文件

    "rt"   以文本读方式打开,只能读文件 , 如果文件不存在,会发生异常      

    "wt" 以文本写方式打开,只能写文件, 如果文件不存在,创建该文件

                                                         如果文件已存在,先清空,再打开文件

    "rb+"   以二进制读方式打开,可以读、写文件 , 如果文件不存在,会发生异常      

    "wb+" 以二进制写方式打开,可以读、写文件, 如果文件不存在,创建该文件

                                                         如果文件已存在,先清空,再打开文件

    2、关闭文件

    f.close()

    当文件读写完毕后,应关闭文件。

    3、清空文件内容

    f.truncate()

    注意:仅当以 "r+"   "rb+"    "w"   "wb" "wb+"等以可写模式打开的文件才可以执行该功能。

    4、文件的指针定位与查询

    (1)文件指针:

          文件被打开后,其对象保存在 f 中, 它会记住文件的当前位置,以便于执行读、写操作,这个位置称为文件的指针( 一个从文件头部开始计算的字节数 long 类型 )。

    (2)文件打开时的位置:

          以"r"   "r+"   "rb+" 读方式, "w"   "w+"   "wb+"写方式 打开的文件,

         一开始,文件指针均指向文件的头部。

    (3) 获取文件指针的值:

          L = f.tell()

    (4) 移动文件的指针

           f.seek(   偏移量, 选项 )

          选项 =0 时, 表示将文件指针指向从文件头部到 "偏移量"字节处。

          选项 =1 时, 表示将文件指针指向从文件的当前位置,向后移动 "偏移量"字节。

          选项 =2 时, 表示将文件指针指向从文件的尾部,,向前移动 "偏移量"字节。

    5、从文件读取指内容   

    (1) 文本文件(以"rt"方式打开的文件)的读取  

              s = f.readline(     )

            返回值: s 是字符串,从文件中读取的一行,含行结束符。

            说明: (1)  如果 len( s ) =0 表示已到文件尾

                        (2)   如果是文件的最后一行,有可能没有行结束符

    (2) 二进制文件(以"rb"、"rb+"、"wb+" 方式打开的文件)的读取  

              s = f.read(    n )

       

         说明: (1)  如果 len( s ) =0 表示已到文件尾

                      (2)   文件读取后,文件的指针向后移动 len(s) 字节。

                    (3)如果磁道已坏,会发生异常。

    6、向文件写入一个字符串   

        f.write(    s )

        参数:       s 要写入的字符串

        说明: (1)文件写入后,文件的指针向后移动 len(s) 字节。

                     (2)如果磁道已坏,或磁盘已满会发生异常。

          

    返回值: s 是字符串,从文件中读取的内容

    7、删除文件

    import os

    os.remove(file)

    ################################分割线#################################################

    读文件

    打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的):

    >>> f = open('test.txt', 'r')

    r表示是文本文件,rb是二进制文件。(这个mode参数默认值就是r)

    如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在:

    >>> f=open('test.txt', 'r')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

    文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的

    >>> f.close()

    由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:

    复制代码
    try:
        f = open('/path/to/file', 'r')
        print(f.read())
    finally:
        if f:
            f.close()
    复制代码

    但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:

    with open('/path/to/file', 'r') as f:
        print(f.read())

    python文件对象提供了三个“读”方法: read()、readline() 和 readlines()。每种方法可以接受一个变量以限制每次读取的数据量。

    • read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果文件大于可用内存,为了保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。
    • readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。
    • readline() 每次只读取一行,通常比readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 readline()。

    注意:这三种方法是把每行末尾的' '也读进来了,它并不会默认的把' '去掉,需要我们手动去掉。

    In[2]: with open('test1.txt', 'r') as f1:
        list1 = f1.readlines()
    In[3]: list1
    Out[3]: ['111
    ', '222
    ', '333
    ', '444
    ', '555
    ', '666
    ']    

    去掉' '

    复制代码
    In[4]: with open('test1.txt', 'r') as f1:
        list1 = f1.readlines()
    for i in range(0, len(list1)):
        list1[i] = list1[i].rstrip('
    ')
    In[5]: list1
    Out[5]: ['111', '222', '333', '444', '555', '666']
    复制代码

    对于read()和readline()也是把' '读入了,但是print的时候可以正常显示(因为print里的' '被认为是换行的意思)

    复制代码
    In[7]: with open('test1.txt', 'r') as f1:
        list1 = f1.read()
    In[8]: list1
    Out[8]: '111
    222
    333
    444
    555
    666
    '
    In[9]: print(list1)
    111
    222
    333
    444
    555
    666
    
    In[10]: with open('test1.txt', 'r') as f1:
        list1 = f1.readline()
    In[11]: list1
    Out[11]: '111
    '
    In[12]: print(list1)
    111
    复制代码

    一个python面试题的例子:

    有两个文件,每个都有很多行ip地址,求出两个文件中相同的ip地址:

    复制代码
    # coding:utf-8
    import bisect

    with open('test1.txt', 'r') as f1:
    list1 = f1.readlines()
    for i in range(0, len(list1)):
    list1[i] = list1[i].strip(' ')
    with open('test2.txt', 'r') as f2:
    list2 = f2.readlines()
    for i in range(0, len(list2)):
    list2[i] = list2[i].strip(' ')

    list2.sort()
    length_2 = len(list2)
    same_data = []
    for i in list1:
    pos = bisect.bisect_left(list2, i)
    if pos < len(list2) and list2[pos] == i:
    same_data.append(i)
    same_data = list(set(same_data))
    print(same_data)
    复制代码

    要点就是:(1)用with (2)处理行末的' ' (3)使用二分查找提高算法效率。(4)使用set快速去重。

    写文件

    写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件:

    >>> f = open('test.txt', 'w') # 若是'wb'就表示写二进制文件
    >>> f.write('Hello, world!')
    >>> f.close()

    注意:'w'这个模式是酱紫:如果没有这个文件,就创建一个;如果有,那么就会先把原文件的内容清空再写入新的东西。所以若不想清空原来的内容而是直接在后面追加新的内容,就用'a'这个模式。

    我们可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来得保险:

    with open('test.txt', 'w') as f:
        f.write('Hello, world!')

    python文件对象提供了两个“写”方法: write() 和 writelines()。

    • write()方法和read()、readline()方法对应,是将字符串写入到文件中。
    • writelines()方法和readlines()方法对应,也是针对列表的操作。它接收一个字符串列表作为参数,将他们写入到文件中,换行符不会自动的加入,因此,需要显式的加入换行符。
    复制代码
    f1 = open('test1.txt', 'w')
    f1.writelines(["1", "2", "3"])
    #    此时test1.txt的内容为:123
    
    f1 = open('test1.txt', 'w')
    f1.writelines(["1
    ", "2
    ", "3
    "])
    #    此时test1.txt的内容为:
    #    1
    #    2        
    #    3
    复制代码

    关于open()的mode参数

    'r':读

    'w':写

    'a':追加

    'r+' == r+w(可读可写,文件若不存在就报错(IOError))

    'w+' == w+r(可读可写,文件若不存在就创建)

    'a+' ==a+r(可追加可写,文件若不存在就创建)

    对应的,如果是二进制文件,就都加一个b就好啦:

    'rb'  'wb'  'ab'  'rb+'  'wb+'  'ab+'

    file_obj.seek(offset,whence=0)

    file_obj.seek(offset,whence=0)方法用来在文件中移动文件指针。offset表示偏移多少。可选参数whence表示从哪里开始偏移,默认是0为文件开头,1为当前位置,2为文件尾部。举例:

    复制代码
    f = open("test1.txt", "a+")
    print(f.read())
    f.write('1')
    f.seek(0, 0)# 把文件指针从末尾移到开头,没有这句话下面的read()就读不到正确的东西
    print(f.read())
    f.close()
    复制代码

    注意:这个文件指针的改变只是作用于'r',对'w'和'a'不会起作用,如果是'w',那么write()永远都是从开头写(会覆盖后面对应位置的内容),是'a'的话write()就永远都是从最后开始追加。

    字符编码

    要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:

    >>> f = open('test.txt', 'r', encoding='gbk')
    >>> f.read()
    '测试'

    遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:

    >>> f = open('test.txt', 'r', encoding='gbk', errors='ignore')
  • 相关阅读:
    阿里P8架构师谈:阿里双11秒杀系统如何设计?
    秒杀系统设计的知识点
    秒杀系统架构优化思路
    秒杀系统解决方案
    Entity Framework Code First (七)空间数据类型 Spatial Data Types
    Entity Framework Code First (六)存储过程
    Entity Framework Code First (五)Fluent API
    Entity Framework Code First (四)Fluent API
    Entity Framework Code First (三)Data Annotations
    Entity Framework Code First (二)Custom Conventions
  • 原文地址:https://www.cnblogs.com/lantingg/p/9708542.html
Copyright © 2011-2022 走看看