您现在的位置是:网站首页>>Python>>python

python文件处理函数及方法

发布时间:2018-07-31 10:16:17作者:wangjian浏览量:496点赞量:0

    读和写文件

    open() 将会返回一个 file 对象,语法结构如下:

    open(filename, mode)

    filename:包含了你要访问的文件名称的字符串值。

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

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

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

    下图很好的总结了这几种模式:

    image.png

    模式rr+ww+aa+
    ++
    +
    +

    +++++
    创建

    ++++
    覆盖

    ++

    指针在开始++++

    指针在结尾



    ++

    例:

    #!/usr/bin/python3
    # 打开一个文件
    f = open("/tmp/foo.txt", "w")
    f.write( "Python 是一个非常好的语言。\n是的,的确非常好!!\n" )
    # 关闭打开的文件
    f.close()

    第一个参数为要打开的文件名。

    第二个参数描述文件如何使用的字符。 mode 可以是 'r' 如果文件只读, 'w' 只用于写 (如果存在同名文件则将被删除), 和 'a' 用于追加文件内容; 所写的任何数据都会被自动增加到末尾. 'r+' 同时用于读写。 mode 参数是可选的; 'r' 将是默认值。

    此时打开文件 foo.txt,显示如下:

    Python 是一个非常好的语言。
    是的,的确非常好!!

    文件对象的方法

    f.read():读取文件内容

    例:

    #!/usr/bin/python3
    # 打开一个文件
    f = open("/tmp/foo.txt", "r")
    str = f.read()
    print(str)
    # 关闭打开的文件
    f.close()

    执行以上程序,输出结果为:

    Python 是一个非常好的语言。
    是的,的确非常好!!


    f.readline():从文件中读取单独的一行。换行符为 '\n'(f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行)

    例:

    #!/usr/bin/python3
    # 打开一个文件
    f = open("/tmp/foo.txt", "r")
    str = f.readline()
    print(str)
    # 关闭打开的文件
    f.close()

    执行以上程序,输出结果为:


    Python 是一个非常好的语言。

    f.readlines():返回该文件中包含的所有行(如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割)

    例:

    #!/usr/bin/python3
    # 打开一个文件
    f = open("/tmp/foo.txt", "r")
    str = f.readlines()
    print(str)
    # 关闭打开的文件
    f.close()

    执行以上程序,输出结果为:


    ['Python 是一个非常好的语言。\n', '是的,的确非常好!!\n']

    另一种方式是迭代一个文件对象然后读取每行:


    #!/usr/bin/python3
    # 打开一个文件
    f = open("/tmp/foo.txt", "r")
    for line in f:
        print(line, end='')
    # 关闭打开的文件
    f.close()

    执行以上程序,输出结果为:


    Python 是一个非常好的语言。
    是的,的确非常好!!


    f.write(string):将 string 写入到文件中, 然后返回写入的字符数

    #!/usr/bin/python3


    # 打开一个文件

    f = open("/tmp/foo.txt", "w")


    num = f.write( "Python 是一个非常好的语言。\n是的,的确非常好!!\n" )

    print(num)

    # 关闭打开的文件

    f.close()

    执行以上程序,输出结果为:

    29

    如果要写入一些不是字符串的东西, 那么将需要先进行转换:


    #!/usr/bin/python3
    # 打开一个文件
    f = open("/tmp/foo1.txt", "w")
    value = ('www.runoob.com', 14)
    s = str(value)
    f.write(s)
    # 关闭打开的文件
    f.close()

    执行以上程序,打开 foo1.txt 文件:


    $ cat /tmp/foo1.txt 
    ('www.runoob.com', 14)

    f.tell():返回文件对象当前所处的位置, 它是从文件开头开始算起的字节数


    f.seek():改变文件当前的位置

    f.seek(offset, from_what):

    from_what 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:

    seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符

    seek(x,1) : 表示从当前位置往后移动x个字符

    seek(-x,2):表示从文件的结尾往前移动x个字符

    from_what 值为默认为0,即文件开头

    例:

    >>> f = open('/tmp/foo.txt', 'rb+')
    >>> f.write(b'0123456789abcdef')
    16
    >>> f.seek(5)     # 移动到文件的第六个字节
    5
    >>> f.read(1)
    b'5'
    >>> f.seek(-3, 2) # 移动到文件的倒数第三字节
    13
    >>> f.read(1)
    b'd'

    f.close():关闭文件并释放系统的资源

    当处理一个文件对象时, 使用 with 关键字是非常好的方式。在结束后, 它会帮你正确的关闭文件

    例:

    >>> with open('/tmp/foo.txt', 'r') as f:
    ...     read_data = f.read()
    >>> f.closed
    True

    pickle 模块:实现了基本的数据序列和反序列化

    基本接口:

    pickle.dump(obj, file, [,protocol])

    pickle 这个对象,能对file(文件)以读取的形式打开:

    x = pickle.load(file)

    注解:从 file 中读取一个字符串,并将它重构为原来的python对象

    file: 类文件对象,有read()和readline()接口。

    例1:

    #!/usr/bin/python3
    import pickle
    # 使用pickle模块将数据对象保存到文件
    data1 = {'a': [1, 2.0, 3, 4+6j],
             'b': ('string', u'Unicode string'),
             'c': None}
    selfref_list = [1, 2, 3]
    selfref_list.append(selfref_list)
    output = open('data.pkl', 'wb')
    # Pickle dictionary using protocol 0.
    pickle.dump(data1, output)
    # Pickle the list using the highest protocol available.
    pickle.dump(selfref_list, output, -1)
    output.close()

    例2:

    #!/usr/bin/python3
    import pprint, pickle
    #使用pickle模块从文件中重构python对象
    pkl_file = open('data.pkl', 'rb')
    data1 = pickle.load(pkl_file)
    pprint.pprint(data1)
    data2 = pickle.load(pkl_file)
    pprint.pprint(data2)
    pkl_file.close()

    输出结果为:

    {'a': [1, 2.0, 3, (4+6j)], 'b': ('string', 'Unicode string'), 'c': None}
    [1, 2, 3, <Recursion on list with id=35781688>]

    简单的python爬虫:

    from urllib import request
    response = request.urlopen("https://www.baidu.com/")  # 打开网站
    fi = open("project.txt", 'w')                        # open一个txt文件
    page = fi.write(str(response.read()))                # 网站代码写入
    fi.close()                                           # 关闭txt文件

    input() 默认输入的为 str 格式,若用数学计算,则需要转换格式,例:

    a=input('请输入数字:')
    print(a*2)

    假设输入数值为3,则上例中得出结果为:

    33

    若将代码修改为:

    a=int(input('请输入数字:'))
    print(a*2)

    则结果为:

    6

    使用pickle实现简单的联系人信息管理:

    import pickle
    import os
    datafile = 'person.data'
    line = '======================================='
    message = '''
    =======================================
    Welcome bookmark:
        press 1 to show list
        press 2 to add pepole
        press 3 to edit pepole
        press 4 to delete pepole
        press 5 to search pepole
        press 6 to show menu
        press 0 to quit
    =======================================
    '''
    print(message)
    class Person(object):
        """通讯录联系人"""
        def __init__(self, name, number):
            self.name = name
            self.number = number
    # 获取数据
    def get_data(filename=datafile):
        # 文件存在且不为空
        if os.path.exists(filename) and os.path.getsize(filename):
            with open(filename,'rb') as f:
                return pickle.load(f)
        return None
            
    # 写入数据
    def set_data(name, number, filename=datafile):
        personList = {} if get_data() == None else get_data()
        with open(filename,'wb') as f:
            personList[name] = Person(name,number)
            pickle.dump(personList,f)
    # 保存字典格式的数据到文件
    def save_data(dictPerson, filename=datafile):
        with open(filename,'wb') as f:
            pickle.dump(dictPerson,f)
    # 显示所有联系人
    def show_all():
        personList = get_data()
        if personList:
            for v in personList.values():
                print(v.name,v.number)
            print(line)
        else:
            print('not yet person,please add person')
            print(line)
    # 添加联系人
    def add_person(name,number):
        set_data(name,number)
        print('success add person')
        print(line)
    # 编辑联系人
    def edit_person(name,number):
        personList = get_data()
        if personList:
            personList[name] = Person(name,number)
            save_data(personList)
            print('success edit person')
            print(line)
    # 删除联系人
    def delete_person(name):
        personList = get_data()
        if personList:
            if name in personList:
                del personList[name]
                save_data(personList)
                print('success delete person')
            else:
                print(name,' is not exists in dict')
            print(line)
    # 搜索联系人
    def search_person(name):
        personList = get_data()
        if personList:
            if name in personList.keys():
                print(personList.get(name).name, personList.get(name).number)
            else:
                print('No this person of ',name)
            print(line)
            
    while True:
        num = input('>>')
        if num == '1':
            print('show all personList:')
            show_all()
        elif num == '2':
            print('add person:')    
            name = input('input name>>')
            number = input('input number>>')
            add_person(name,number)
        elif num == '3':
            print('edit person:')
            name = input('input name>>')
            number = input('input number>>')
            edit_person(name,number)
        elif num == '4':
            print('delete person:')
            name = input('input name>>')
            delete_person(name)
        elif num == '5':
            print('search :')
            name = input('input name>>')
            search_person(name)
        elif num == '6':
            print(message)
        elif num == '0':
            break
        else:
            print('input error, please retry')

    File(文件) 方法

    序号方法及描述
    1

    file.close()

    关闭文件。关闭后文件不能再进行读写操作。

    2

    file.flush()

    刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。

    3

    file.fileno()

    返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。

    4

    file.isatty()

    如果文件连接到一个终端设备返回 True,否则返回 False。

    5

    file.next()

    返回文件下一行。

    6

    file.read([size])

    从文件读取指定的字节数,如果未给定或为负则读取所有。

    7

    file.readline([size])

    读取整行,包括 "\n" 字符。

    8

    file.readlines([sizeint])

    读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。

    9

    file.seek(offset[, whence])

    设置文件当前位置

    10

    file.tell()

    返回文件当前位置。

    11

    file.truncate([size])

    从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。

    12

    file.write(str)

    将字符串写入文件,返回的是写入的字符长度。

    13

    file.writelines(sequence)

    向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。


0 +1